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;
}