詳細的程序代碼如下:(給出了詳細的解釋,本程序在VC6.0或TC2.0都編譯通過)
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include<process.h>
typedef struct student
{
char sequenceNumber[10];/*序號*/
char name[20];/*姓名*/
char classNumber[20];/*班級*/
char telephone[20];/*手機號*/
char E_mail[20];/*Email*/
char dormitoryNumber[10];/*宿舍號*/
struct student *next;
}student;
student *headLink;/*鏈表表頭指針*/
/*以下是函數聲明*/
void DesplayMenu(void);
void CreateHeadLink(void);
student *MallocNode(void);
void GetInformation(student *t);
void OutputInformation(void);
void classNumberBytelephone(void);
void DesplayInfoBysequenceNumber(void);
void DesplayOneNode(student *t);
void InsertOneNode(student *t);
void DeleteNodeBysequenceNumber(void);
void DesplayInfoByName(void);
int choose;/*用於接受用戶的選擇*/
/*主函數*/
void main()
{
CreateHeadLink();
DesplayMenu();
}
/************************************
函數功能:顯示菜單,根據用戶的輸入
完成相應的功能
************************************/
void DesplayMenu(void)
{
student *p;
printf("\n-------請選擇相應功能-------------\n\n");
printf("| 1 顯示所有學生信息 |\n");
printf("| 2 按學生序號高到低排序 |\n");
printf("| 3 根據學生序號查詢學生的信息 |\n");
printf("| 4 根據學生姓名查詢學生的信息 |\n");
printf("| 5 增加壹個學生 |\n");
printf("| 6 刪除某壹學生 |\n");
printf("| 7 退出 |\n\n");
scanf("%d",&choose);/*取得用戶的選擇*/
switch(choose)
{
case 1:
OutputInformation();
break;
case 2:
classNumberBytelephone();
break;
case 3:
DesplayInfoBysequenceNumber();
break;
case 4:
DesplayInfoByName();
break;
case 5:
p=MallocNode();/*先申請壹個新結點*/
GetInformation(p);/*要求用戶輸入信息到新結點中*/
InsertOneNode(p);/*將新結點加到鏈表中*/
break;
case 6:
DeleteNodeBysequenceNumber();
break;
case 7:
free(headLink);/*先釋放內存空間*/
exit(1);
break;
default:
break;
}
DesplayMenu();/*遞歸調用*/
}
/************************************
函數功能:建立鏈表表頭
************************************/
void CreateHeadLink(void)
{
student *p;
p=(student*)malloc(sizeof(student));
headLink=p;
p->next=NULL;
}
/************************************
函數功能:申請壹個新結點,並將其初始化
************************************/
student *MallocNode(void)
{
student *p;
int i;
p=(student*)malloc(sizeof(student));
if(p==NULL)
return NULL;
for(i=0;i<10;i++)
p->sequenceNumber[i]='\0';
for(i=0;i<20;i++)
p->classNumber[i]='\0';
for(i=0;i<20;i++)
p->name[i]='\0';
for(i=0;i<20;i++)
p->E_mail[i]='\0';
for(i=0;i<10;i++)
p->dormitoryNumber[i]='\0';
for(i=0;i<10;i++)
p->telephone[i]='\0';
p->next=NULL;
return p;
}
/************************************
函數功能:取得用戶輸入的學生信息
************************************/
void GetInformation(student *t)
{
printf("請輸入序號:\n");
scanf("%s",t->sequenceNumber);
printf("請輸入班級:\n");
scanf("%s",t->classNumber);
printf("請輸入姓名:\n");
scanf("%s",t->name);
printf("請輸入電話:\n");
scanf("%s",t->telephone);
printf("請輸入Email:\n");
scanf("%s",t->E_mail);
printf("請輸入宿舍號:\n");
scanf("%s",t->dormitoryNumber);
}
/************************************
函數功能:在鏈表的結尾處增加壹個結點
************************************/
void InsertOneNode(student *t)
{
student *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/************************************
函數功能:根據用戶輸入的序號顯示該序號學生的信息
************************************/
void DesplayInfoBysequenceNumber(void)
{
student *p;
char good[10];
char flag=0;
p=headLink->next;
if(p==NULL)
{
printf("對不起,現在沒有學生信息!\n");
return;
}
printf("請輸入序號:\n");
scanf("%s",good);
while(p)
{
if(strcmp(p->sequenceNumber,good)==0)
{
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("對不起,不存在序號為 %s 的學生\n",good);
}
/************************************
函數功能:根據用戶輸入的姓名顯示該學生的信息
************************************/
void DesplayInfoByName(void)
{
student *p;
char name[10];
char flag=0;
p=headLink->next;
printf("請輸入姓名:\n");
scanf("%s",name);
while(p)
{
if(strcmp(p->sequenceNumber,name)==0)
{
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("對不起,不存在姓名為 %s 的學生\n",name);
}
/************************************
函數功能:輸出壹個學生結點的信息
************************************/
void DesplayOneNode(student *t)
{
printf("%s\t",t->sequenceNumber);
printf("%s\t",t->classNumber);
printf("%s\t",t->name);
printf("%s\t",t->telephone);
printf("%s\t",t->E_mail);
printf("%s\t\n",t->dormitoryNumber);
}
/************************************
函數功能:根據用戶輸入的序號刪除該學生
************************************/
void DeleteNodeBysequenceNumber(void)
{
char good[10];
student *p,*q;
char flag=0;
printf("請輸入要刪除的學生序號:");
scanf("%s",good);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->sequenceNumber,good)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
printf("不存在這學生\n");
}
/************************************
函數功能:顯示所有學生的信息
************************************/
void OutputInformation(void)
{
student *p;
p=headLink->next;
if(p==NULL)
{
printf("現在沒有學生信息,請先輸入學生\n\n");
return;
}
printf("序號\t班級\t姓名\t電話\t郵箱\t宿舍號\t\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
/************************************
函數功能:根據用戶輸入的班級,按序號到低排序
************************************/
void classNumberBytelephone(void)
{
char classNumber[20];
student exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("現在還沒學生信息,請先輸入學生信息\n");
return;
}
printf("請輸入班級名:\n");
scanf("%s",classNumber);
while(r)/*兩層while循環實現排序*/
{
p=r;
q=r->next;
while(q)
{
if((strcmp(p->sequenceNumber,q->sequenceNumber)>0)/*序號大時才交換*/
&&(strcmp(p->classNumber,classNumber)==0)/*並且班級相同時才交換*/
&&(strcmp(q->classNumber,classNumber)==0))
{
strcpy(exchange.sequenceNumber,q->sequenceNumber);/*先復制q結點信息到exchange*/
strcpy(exchange.E_mail,q->E_mail);
strcpy(exchange.dormitoryNumber,q->dormitoryNumber);
strcpy(exchange.name,q->name);
strcpy(exchange.classNumber,q->classNumber);
strcpy(exchange.telephone,q->telephone);
strcpy(q->sequenceNumber,p->sequenceNumber);/*再復制p結點信息到q*/
strcpy(q->E_mail,p->E_mail);
strcpy(q->dormitoryNumber,p->dormitoryNumber);
strcpy(q->name,p->name);
strcpy(q->classNumber,p->classNumber);
strcpy(q->telephone,p->telephone);
strcpy(p->sequenceNumber,exchange.sequenceNumber);/*最後復制exchange結點信息到p*/
strcpy(p->E_mail,exchange.E_mail);
strcpy(p->dormitoryNumber,exchange.dormitoryNumber);
strcpy(p->name,exchange.name);
strcpy(p->classNumber,exchange.classNumber);
strcpy(p->telephone,exchange.telephone);
}
q=q->next;
}
r=r->next;
}
}