#include
#include
typedef struct student
{
int num;
int score;
struct student *next;
}student;
void add(student *s)//全局的增加函數
{
printf("請輸入學生學號與分數:\n");
scanf("%d %d",&s->num,&s->score);
}
void print(student *head)
{
printf("--------------打印--------------\n");
printf("學號 分數\n");
while((head=head->next)!=NULL)
{
printf("%d %d\n",head->num,head->score);
}
printf("打印成功!\n");
printf("--------------------------------\n");
//printf("按回車鍵繼續");
//char a;
//scanf("%c",&a);
}
void mDelete(student *s)//先定義一個函數,函數的參數s是studen類,s是已存入num和grade的指針,s是我們需要刪掉的對象
{
int num;
printf("--------------刪除--------------\n");
printf("請輸入要刪除學生的學號:");
scanf("%d",&num);
while(s!=NULL)//當存在這麼一個我們需要的結構體s的不為空指針
{
struct student *last=s;//定義一個student類的變量為last,把參數s的num和grade賦給last
s=s->next;//把指針s下一項的地址給s
if(s->num==num)
{
last->next=s->next;//把s的前一項和s的後一項直接相連接
printf("刪除學生%d成功!\n",num);
printf("--------------------------------\n");
return;
}
}
printf("未找到學生%d!\n",num);
printf("--------------------------------\n");
}
void mAdd(student *s)//先定義一個函數,函數的參數s是studen類,s是已存入num和grade的指針,s是我們增加的前一名同學
{
int num;//聲明用於計數的num
printf("--------------添加--------------\n");
printf("請輸入要添加到哪個學生之後:");
scanf("%d",&num);
while(s!=NULL)//當參數不為空指針時開始循環
{
struct student *next=s->next;//聲明一個next的指針,把已經確定的s的下一項的地址給指針next
if(s->num==num)//尋找滿足輸入num數字條件的那個結構體,用if語句來確定某個確定的結構體
{
student *a=(student *)malloc(sizeof(student));//給新同學開辟內存a是我們新增加的同學
add(a);
num=a->num;//把新同學的的學號給剛剛輸入的號碼
s->next=a;//鏈接
a->next=next;
printf("添加學生%d成功!\n",num);//可以把num改成a->num
printf("--------------------------------\n");
return;
}
s=next;//沒懂,考慮刪除換成直接打印“未找到”//s=next;就是跟i++類似的,讓循環繼續下去,否則會死循環,不會結束。
}
printf("未找到學生%d!\n",num);
printf("--------------------------------\n");
}
void update(student *s)
{
int num;
printf("--------------更新--------------\n");
printf("請輸入要更新的學生的學號:");
scanf("%d",&num);
while(s!=NULL)
{
if(s->num==num)
{
printf("輸入學生%d的新分數:\n",num);
scanf("%d",&s->score);
printf("更新學生%d成功!\n",num);
printf("--------------------------------\n");
return;
}
s=s->next;
}
printf("未找到學生%d!\n",num);
printf("--------------------------------\n");
}
void findScore(student *s)
{
int num;
printf("--------------查找--------------\n");
printf("請輸入要查找的學生學號:");
scanf("%d",&num);
while(s!=NULL)
{
if(s->num==num)
{
printf("查找成功!\n學生%d的分數為%d\n",num,s->score);
printf("--------------------------------\n");
return;
}
s=s->next;
}
printf("未找到學生%d!\n",num);
printf("--------------------------------\n");
}
void findNum(student *s)
{
int score;
printf("--------------查找--------------\n");
printf("請輸入要查找的成績:");
scanf("%d",&score);
printf("分數為%d的學生學號為:\n",score);
while(s!=NULL)
{
if(s->score==score)
{
printf("%d\n",s->num);
}
s=s->next;
}
printf("查找完畢!\n");
printf("--------------------------------\n");
}
int printFunction()
{
printf("============================\n");
printf("輸入以下數字執行對應功能:\n");
printf("1.打印\n");
printf("2.刪除\n");
printf("3.添加\n");
printf("4.更新\n");
printf("5.查找分數\n");
printf("6.查找學生\n");
printf("7.退出\n");
printf("============================\n\n");
printf("輸入你的選擇:");
int a=0;
scanf("%d",&a);
return a;
}
student *create()
{
student *head,*a,*b;
head=(student *)malloc(sizeof(student));
a=b=(student *)malloc(sizeof(student));
add(a);
head->num=0;
head->score=0;
head->next=a;
while(a->num!=0)
{
b=a;
a=(student *)malloc(sizeof(student));
add(a);
b->next=a;
}
b->next=NULL;
return head;
}
int main()
{
puts("這是一個鏈表測試工程。");
student *head;
head=create();
int choose;
while((choose=printFunction())!=7)
{
switch(choose)
{
case 1: print(head); break;
case 2: mDelete(head); break;
case 3: mAdd(head); break;
case 4: update(head); break;
case 5: findScore(head); break;
case 6: findNum(head); break;
default: break;
}
}
free(head);
return 0;
}
為什麼需要用while來循環。
你用的是鏈表,鏈表需要自己去控制遍歷,while的作用就是遍歷你的鏈表,知道遍歷到鏈表結束為止