1. 程式人生 > >c語言描述資料結構例項一

c語言描述資料結構例項一

1 線性結構的操作

1.1實驗資料

學生的學號、姓名、性別、年齡

1.2程式要求

1、用線性表的順序儲存(陣列)儲存資料

(1)鍵盤輸入你所在宿舍的同學資訊到陣列;

(2)遍歷輸出所有學生資料;

(3)按姓名查詢並輸出指定學生資料,統計查詢的次數;

(4)把陣列內容輸出到檔案;

(5)從檔案讀入學生資料,按學號排序後顯示在螢幕;

(6)某同學調入你的宿舍,請增加其資訊;並檢視增加後的結果;

(7) 某同學調離你的宿舍,請刪除其資訊;並檢視刪除後的結果;

2、用線性表的鏈式儲存(連結串列)儲存資料,重新實現第1題的功能。

1.4 程式清單及詳解

//順序表

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define maxsize 100

typedef  struct

{

         int num;

         char name[10];

         char gender[3];

         int age;

}studen;

typedef  struct

{

         studen elen[maxsize];

         int last;

}seqlist;

seqlist  s;

int k=1;//統計查詢次數

static int len;//靜態全域性變數,存放輸入的宿舍人數

void init()

{

         int i;

          printf("請輸入學生宿舍人數:");

            scanf("%d",&len);

            s.last=len-1;

              for(i=0;i<=s.last;i++)

                    {

                              printf("請輸入第%d個學生學號:",i+1);

                               scanf("%d",&s.elen[i].num);

                                 printf("請輸入第%d個學生姓名:",i+1);

                                        scanf("%s",s.elen[i].name);

                                          printf("請輸入第%d個學生性別:",i+1);

                                                scanf("%s",s.elen[i].gender);

                                printf("請輸入第%d個學生年齡:",i+1);

                                     scanf("%d",&s.elen[i].age);

                                     printf("\n");     

                    }     

                     printf("輸入學生資訊完成!");   

}

void stuprint()//顯示函式

{

         int i;

          printf("學生資訊\n");

          printf("學號\t姓名\t性別\t年齡\n");

           for(i=0;i<=s.last;i++)

           {

         printf("%d\t%s\t%s\t%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);

           }

           printf("\n");

}

void locate()//按照姓名查詢

{

         int i=0;

         char xm[10];

         printf("請輸入要查詢的學生姓名:");

          scanf("%s",xm);

          while((i<=s.last)&&(strcmp(s.elen[i].name,xm))!=0)

          {

                    i++;

                    k++;

          }

                   printf("查詢的次數為:%d",k);

                   printf("\n");

          if(i<=s.last)

          {

                   printf("學號:%d\t姓名:%s\t性別:%s\t年齡:%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,

         s.elen[i].age);

          }

         else

                   printf("未找到該學生!\n");

}

void insertlist(seqlist *s)//插入

{

         int i;

         int k;

         printf("請輸入要插入的位置");

         scanf("%d",&i);

         if((i<1)||(i>s->last+2))

         {

                   printf("插入的位置不合法!");

         }

         if(s->last>=maxsize-1)

                   printf("表已滿,無法插入!");

         else

         {

         for(k=s->last;k>=i-1;k--)

                   s->elen[k+1]=s->elen[k];

           printf("請輸入要新增的學生資訊!\n");

           printf("請輸入學生的學號:");

                   scanf("%d", &s->elen[i - 1].num);

                   printf("請輸入學生的姓名:");

                   scanf("%s", s->elen[i - 1].name);

                   printf("請輸入學生的性別:");

                   scanf("%s", s->elen[i - 1].gender);

                   printf("請輸入學生的年齡:");

                   scanf("%d", &s->elen[i - 1].age);

      s->last=s->last+1;

         }

}

void delelist(seqlist *s)

/*按姓名刪除*/

{

         int i = 0, k;

         char xm[10];//存放輸入要刪除的資料

         printf("請輸入要刪除的姓名:");

         scanf("%s", xm);

         while ((i <= s->last) && (strcmp(s->elen[i].name, xm)) != 0)

                   i++;

         if (i <= s->last)

         {

                   printf("刪除學生資訊為:學號:%d  姓名:%s 性別:%s 年齡:%d ", s->elen[i].num, s->elen[i].name, s->elen[i].gender,s->elen[i].age);

                   for (k = i; k <= s->last; k++)

                            s->elen[k-1] = s->elen[k];  

                   s->last--;

         }

         else

                   printf("沒有該學生!\n");

}

//寫檔案操作

void savetofile()

{

   FILE *fp;

    if((fp=fopen("d:\\st1.txt","wb+"))==NULL)

                 

    {

                   printf("不能開啟檔案");

           return;

         }

  for(int i=0;i<=s.last;i++)

{ fprintf(fp,"%d %s %s %d\r\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);  //寫入資料到檔案中

  }

 printf("\n寫入成功!\n");

}

//讀檔案操作

void readfile()

{

         FILE * fp; //指標變數

         int i;

         if((fp=fopen("d:\\st1.txt","rb"))==NULL) //rb方式 開啟 是用2進位制方法開啟,只讀檔案

         {

                   printf("Cannot open file\n"); 

                   return;

         }

                   for(i=0;i<=s.last;i++)        

                   {       

         fscanf(fp,"%d %s %s %d\r\n",&s.elen[i].num,s.elen[i].name,s.elen[i].gender,&s.elen[i].age); //從檔案中讀取資料

             printf("讀取的檔案中學號為:%d  姓名:%s  性別:%s  年齡:%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);

//輸出讀取的資料

                   }

    fclose(fp);//檔案關閉

}

void menu()  //目錄

{

         printf("\n\n\n\n");

         printf("\t\t\t學生資訊管理系統\n");

         printf("\t\t\t1\t輸入學生資訊\n");

         printf("\t\t\t2\t輸出學生資訊\n");

         printf("\t\t\t3\t查詢學生資訊\n");

         printf("\t\t\t4\t新增學生資訊\n");

         printf("\t\t\t5\t刪除學生資訊\n");

         printf("\t\t\t6\t寫入檔案\n");

         printf("\t\t\t7\t讀取檔案\n");

         printf("\t\t\t0\t退出\n");

         printf("\t\t\n");

         printf("\t\t\t請選擇(0—7):");

}

int main()

{

         int n;

         menu();

         while(1)

         { 

       scanf("%d",&n);

                   switch(n)

                   {  

                 case 1:init();break;

                            case 2:stuprint();break;

                            case 3:locate();break;

                            case 4:insertlist(&s);break;

                            case 5:delelist(&s);break;

                            case 6:savetofile();break;

                            case 7:readfile();break;

                            case 0:exit(0);break;

                            default:printf("\t\t\t請選擇(0—7):");break;

                   }

                   menu();

         }

         return 0;

}

//單鏈表

#include<stdlib.h>

#include<stdio.h>

#include"string.h"

typedef  struct

{

         int num;

         char name[10];

         char sex[10];

         int age;

}stu;

typedef struct Node

{

         stu data;

         struct Node *next;

}Node,*linklist;

static int count;

int k=1;//存放比較的次數

void insert(linklist head)

{

         linklist q,p;

         q=head;

         printf("請輸入學生人數!\n");

         scanf("%d",&count);

         for(int i=0;i<count;i++)//i表示結點數

         {

                   printf("\n輸入第%d個學生資訊:\n",i+1);

                   p=(linklist)malloc(sizeof(Node));

                   printf("輸入學號:");

                   scanf("%d",&p->data.num);

                   printf("輸入姓名:");

                   scanf("%s",p->data.name);

                   printf("輸入性別:");

                   scanf("%s",p->data.sex);

                   printf("輸入年齡:");

                   scanf("%d",&p->data.age);

                   printf("輸入第%d個學生資訊完成!",i+1);

                   if(i==0)

                   {

                            head->next=p; //i=0 連結串列中沒有元素,只有頭節點,把p插入到head之後作為第一個結點

                   }

                   else

                   {

                            q->next=p; 

                   }

                   q=p;

         }

         p->next=NULL;//設定next域為空

}

void print(linklist head)

{

         linklist x;

         x=head->next;

         printf("學生資訊如下:\n");

         while(x)

         {

                   printf("學號:%d\t 姓名:%s\t 性別:%s\t 年齡:%d\n",x->data.num,x->data.name,x->data.sex,x->data.age);

                   x=x->next;

         }

         printf("\n");

}

void locate(linklist l)

{

         Node *p; 

         int flag = 0;//標誌變數

         p = l->next;    /*從表中第一個結點開始 */

         char xm[10];//字元陣列用來存放輸入的姓名

         printf("請輸入要查詢的姓名:");

         scanf("%s", xm);

         while (p != NULL)

         {

                   if (strcmp(p->data.name, xm) != 0)//比較是否相同,為零則相同,成功查詢到

                   {

                            p = p->next;

                            k++; //當要查詢的姓名為第一個的時候,它初始值為1,已經查詢過一次

                   }

                   else

                   {

                            printf("已找到:學號:%d  姓名:%s 性別:%s  年齡%d", p->data.num, p->data.name, p->data.sex, p->data.age);

                            flag = 1;

                            printf("\n");

                                     printf("查詢的次數為:%d",k);

                                               break;

                   }

         }

         if (flag == 0)

                   printf("未找到此人");

}

void  insertlist(linklist l)

{

         int k=0;

         Node *pre,*s;//一個用來存放新節點,一個用來存放查詢插入位置的結點

         int xh,nl;

         char xm[10]; char xb[10];//用來存放要插入的姓名和學號

         int i;

         pre=l;//從頭結點開始尋找

         printf("輸入要插入的位置:");

         scanf("%d",&i);

                   while(pre!=NULL&&k<i-1)

 

                   {

                            pre=pre->next;

                            k=k+1;

                   }

                            if(!pre) /*如當前位置pre為空表已找完還未數到第i個,說明插入位置不合理,當條件不成立時執行*/

                            {

                                     printf("插入位置不合法!");

                            }

                              else

                              {

                                       s=(Node*)malloc(sizeof(Node));

                                      printf("輸入學號:");

                           scanf("%d",&xh);

                           printf("請輸入姓名:");

                                     scanf("%s", xm);

                                     printf("輸入性別:");

                                     scanf("%s",xb);

                                     printf("輸入年齡:");

                                     scanf("%d",&nl);

                                       s->data.num=xh;

                                      strcpy(s->data.name,xm);

                                      strcpy(s->data.sex,xb);

                                      s->data.age=nl;

                                      s->next=pre->next;

                                      pre->next=s;//連線兩個結點

                                      printf("\n插入成功!\n"); 

                              }

}

void dellist(linklist l)

{

         Node *pre,*r;

         int k=0;

         char xm[10];

         int flag=0;

         pre=l;

         printf("輸入要刪除的學生姓名:");

         scanf("%s",xm);

                   while( pre->next!=NULL)

                   {

                            if(strcmp(pre->next->data.name,xm)!=0)

                             {

                                     pre=pre->next;//指向下一個結點

                             }

                             else

                            {

                           flag=1;

                                     break;

                            }

                   }

           if(flag==0)

           {

                     printf("未找到該學生!");

           }

           r=pre->next;//存放要刪除的結點地址

           pre->next=pre->next->next;//實現刪除功能

           printf("刪除成功!\n");

}

void savetofile(linklist head)

{  

    FILE *fp;

         linklist p;

         p=head->next;//指向第一個結點

    if((fp=fopen("d:\\st2.txt","wb+"))==NULL) //  在d盤開啟檔案st2   以wb+方式開啟  如果檔案不存在則會建立,如果檔案存在會覆蓋

                

    {

          printf("不能開啟檔案");

           return;

         }

 while(p)

  {

    //寫入資料到檔案中

         fprintf(fp,"%d %s %s %d\r\n",p->data.num,p->data.name,p->data.sex,p->data.age);

           p=p->next;

  }

 printf("\n寫入成功\n");

}

void readfile(linklist head)//把檔案中的內容做成一個連結串列

{

    FILE *fp;

linklist p;    //定義一個連結串列結點

         p=head->next; //該結點指向第一個元素

         if((fp=fopen("d:\\st2.txt","rb"))==NULL)//  在d盤開啟檔案st2   以rb方式開啟 

              

    {

                   printf("不能開啟檔案");

                   return;

         }

         while(p)  // 如果p存在 讀取檔案中的資料

{

                   {       

                            fscanf(fp,"%d %s %s %d\r\n",&p->data.num,p->data.name,p->data.sex,p->data.age);         //從檔案中讀取資料到連結串列裡面

              

                            printf("讀取的檔案中學號為:%d  姓名:%s  性別:%s  年齡:%d\n",p->data.num,p->data.name,p->data.sex,p->data.age);

                                       p=p->next;//下一個元素

                   }

                   fclose(fp); //檔案關閉

         }

}

void menu()

{

         printf("\n\n\n\n");

         printf("\t\t\t學生資訊管理系統\n");

         printf("\t\t\t1\t輸入學生資訊\n");

         printf("\t\t\t2\t輸出學生資訊\n");

         printf("\t\t\t3\t查詢學生資訊\n");

         printf("\t\t\t4\t新增學生資訊\n");

         printf("\t\t\t5\t刪除學生資訊\n");

         printf("\t\t\t6\t寫入檔案\n");

         printf("\t\t\t7\t讀取檔案\n");

         printf("\t\t\t0\t退出\n");

         printf("\t\t\n");

         printf("\t\t\t請選擇(0—7):");

}

int main()

{

         linklist l;

         l=(linklist)malloc(sizeof(Node));

         l->next=NULL;//初始化頭結點

         int n;

         menu();

         while (1)

         {

                   scanf("%d", &n); //輸入一個整數

                   switch (n)

 

                   {

                   case 0: exit(0);

                   case 1: insert(l); break;

                   case 2: print(l); break;

                   case 3: locate(l); break;

                   case 4: insertlist(l); break;

                   case 5: dellist(l); break;

                   case 6:savetofile(l);break;

                   case 7:readfile(l);break;

                   default: break;

                   }

                   menu();

         }

return 0;

}