一、实验目的
1.掌握线性表链式存储方式的特点;
2.掌握线性表的链式存储基本 *** 作,如建立、查找、插入和删除等。
二、实验内容
定义一个包含学生信息(学号,姓名,性别,年龄)的链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学生信息;
(4) 根据指定的位置可返回相应的学生信息;
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
三、实验提示
学生信息的定义:
typedef struct {
char no[11]; //表示11位学号,也可以定义为string no;
char name[20]; //表示姓名,也可以定义为string name;
char xb; //表示性别,以字母M表示男,字母W表示女
int age; //表示年龄
}Student;
链表结点结构的定义
typedef struct LNode{
Student data; //存放学生信息的数据域
struct LNode *next; //指向下一个学生信息的指针域
}LNode,* linklist;
/*CaptainUniverse_ 2022.3.18*/
#include
#include
#include
#define TRUE 1
#define FALSE 0
static int flag=0;//记录是否创建了信息表 1创建 0未创建(或已删除)
typedef int Status;
int Listlength=0;
typedef struct Student
{
char no[12];
char name[20];
char xb;
int age;
}Student;
typedef struct LNode
{
Student data;
struct LNode *next;
}LNode,*LinkList;
Status createLNode(LinkList *);//创建新的信息表 返回值表成功与否 (内存分配是否成功)
Status judgeList(int);//判断是否建表及是否为空 返回状态值1(继续)0(终止)
Status getFileList(LNode **);//信息表内容以文件输入 返回状态值1(成功)0(失败)
void displayList(LNode *);//展示信息表内容
void printLNode(LNode *);//打印单个学生信息
void delLNode(LNode **);//删除单个学生信息
void insertLNode(LNode **);//插入单个学生信息
void getLNode(LNode *);//输入单个学生信息
void releaseList(LinkList *);//释放占用内存
void printFileList(LNode *);//信息表内容输出为文件
void screen(void);// *** 作提示
LNode *serachLocation(LNode *,int);//按位置返回地址
LNode *searchList(LNode *);//查找学生信息 返回值表查找的学生序号(可能超过学生个数表示没找到)或者取消查找(返回上一级)
Status getFileList(LNode **List)
{
FILE *fp;
fp=fopen("学生信息输入文件.txt","w");
fputs("张三\t20211008111\tW\t18\n",fp);
fputs("李四\t20211008112\tM\t19",fp);
fclose(fp);
putchar('\n');
printf("已将示例文件\"学生信息输入文件.txt\"放入程序目录!\n");
printf("注意:数据间为TAB键!末行不可出现无关字符!性别‘W’为女 ‘M’为男!\n");
printf("请修改文件内容后继续 *** 作!\n");
system("pause");
if((fp=fopen("学生信息输入文件.txt","r"))==NULL)
{
fclose(fp);
return FALSE;
}
while(!feof(fp))
{
LNode *student;
static LNode *tail;
student=(LNode *)malloc(sizeof(LNode));
if(!student)
{
printf("内存分配失败!\n");
return FALSE;
}
fscanf(fp,"%s\t%s\t%c\t%d",student->data.name,student->data.no,&student->data.xb,&student->data.age);
if(*List!=NULL)
{
tail->next=student;
student->next=NULL;
}
else
{
*List=student;
student->next=NULL;
}
tail=student;
Listlength++;
}
fclose(fp);
return TRUE;
}
void insertLNode(LNode **List)
{
int temp;
printf("请输入学生插入到的序号:\n");
printf("(输入0取消 *** 作返回上级)\n");
scanf("%d",&temp);
if(!temp)
{
return;
}
if(temp>0&&temp<=Listlength)
{
LNode *student;
student=(LNode *)malloc(sizeof(LNode));
if(!student)
{
printf("内存分配失败!\n");
return;
}
getLNode(student);
if(temp==1)
{
student->next=*List;
*List=student;
}
else
{
student->next=serachLocation(*List,temp-1)->next;
serachLocation(*List,temp-1)->next=student;
}
printf("插入成功!\n");
Listlength++;
return;
}
else
{
printf("在第%d号位置没有人!插入失败!\n");
return;
}
}
Status judgeList(int flag)
{
if(!flag)
{
printf("你还没有建立过信息表!\n");
return FALSE;
}
if(flag&&!Listlength)
{
printf("此表已空,请删除后重新建表!\n");
return FALSE;
}
return TRUE;
}
void getLNode(LNode *student)
{
printf("请输入学生学号:\n");
scanf("%s",student->data.no);
printf("请输入学生姓名:\n");
scanf("%s",student->data.name);
getchar();
printf("请输入学生性别:('W'为女 'M'为男)\n");
scanf("%c",&student->data.xb);
printf("请输入学生年龄:\n");
scanf("%d",&student->data.age);
}
Status createLNode(LinkList *List)
{
LNode *student;
static LNode *tail;
student=(LNode *)malloc(sizeof(LNode));
if(!student)
{
printf("内存分配失败!\n");
return FALSE;
}
getLNode(student);
if(*List!=NULL)
{
tail->next=student;
student->next=NULL;
}
else
{
*List=student;
student->next=NULL;
}
tail=student;
Listlength++;
return TRUE;
}
void releaseList(LinkList *List)
{
LNode *temp;
while(*List!=NULL)
{
temp=*List;
*List=(*List)->next;
free(temp);
}
Listlength=0;
flag=0;
}
void displayList(LNode *List)
{
LNode *current;
current=List;
int temp=1;
while(current!=NULL)
{
printf("第%d名同学:\n",temp);
printLNode(current);
current=current->next;
temp++;
}
}
void printLNode(LNode *student)
{
printf("-----------------\n");
printf("姓名:%s\n",student->data.name);
printf("学号:%s\n",student->data.no);
switch(student->data.xb)
{
case 'M':
printf("性别:男\n");
break;
case 'W':
printf("性别:女\n");
break;
}
printf("年龄:%d\n",student->data.age);
printf("-----------------\n");
putchar('\n');
}
LNode *searchList(LNode *List)
{
char t_name[20],t_no[12];
int t_choice;
LNode *current;
current=List;
printf("请输入查找方式序号:\n");
printf("1.按姓名查找\n");
printf("2.按学号查找\n");
printf("(输入0取消 *** 作返回上级)\n");
while(1)
{
fflush(stdin);
scanf("%d",&t_choice);
switch(t_choice)
{
case 0:
return -1;
case 1:
printf("请输入要查找的学生姓名:\n");
scanf("%s",t_name);
while(current!=NULL&&strcmp(current->data.name,t_name)!=0)
{
current=current->next;
}
return current;
break;
case 2:
printf("请输入要查找的学生学号:\n");
scanf("%s",t_no);
while(current!=NULL&&strcmp(current->data.no,t_no)!=0)
{
current=current->next;
}
return current;
break;
default:
printf("输入有误!\n");
break;
}
}
}
LNode *serachLocation(LNode *List,int location)
{
int count;
LNode *current;
current=List;
for(count=1;count<=location-1;count++)
{
current=current->next;
}
return current;
}
void delLNode(LNode **List)
{
int temp;
LNode *p;
printf("请输入删除的学生序号:\n");
printf("(输入0取消 *** 作返回上级)\n");
while(scanf("%d",&temp))
{
if(!temp)
{
return;
}
if(temp==1)
{
p=*List;
*List=(*List)->next;
free(p);
printf("删除成功!\n");
Listlength--;
return;
}
if(temp>0&&temp<=Listlength)
{
serachLocation(*List,temp-1)->next=serachLocation(*List,temp+1);
free(serachLocation(*List,temp));
printf("删除成功!\n");
Listlength--;
return;
}
else
{
printf("没有该学号!删除失败!\n");
return;
}
}
}
void printFileList(LNode *List)
{
LNode *current;
current=List;
FILE *fp;
int temp=1;
if((fp=fopen("学生信息统计表.txt","w"))==NULL)
{
printf("打开文件失败!\n");
return;
}
fputs("序号\t姓名\t\t学号\t\t性别\t年龄\t\n\n",fp);
while(current!=NULL)
{
fprintf(fp,"%d\t",temp);
fprintf(fp,"%s\t",current->data.name);
fprintf(fp,"%s\t",current->data.no);
if(current->data.xb=='W')
{
fputs("女",fp);
}
else
{
fputs("男",fp);
}
fputs("\t", fp);
fprintf(fp,"%d",current->data.age);
fputc('\n', fp);
temp++;
current=current->next;
}
fclose(fp);
}
void screen(void)
{
putchar('\n');
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("|------8.统计当前表学生个数------|\n");
printf("|------9.打印并退出当前学生信息表|\n");
printf("|------10.退出学生信息管理工具---|\n");
printf("|-----Powered by CaptainUniverse_|\n");
printf("|———————★————————|\n");
putchar('\n');
}
int main(void)
{
LinkList List=NULL;
while(1)
{
screen();
int Choice;
printf("请输入 *** 作序号:\n");
fflush(stdin);
scanf("%d",&Choice);
switch(Choice)
{
case 1:
if(flag)
{
printf("你已经建立过学生信息表了!\n");
break;
}
printf("建立成功!\n");
flag=1;
int number,choice;
CHOICE: printf("1.以文件输入\n");
printf("2.手动输入\n");
printf("请选择:\n");
scanf("%d",&choice);
if(choice==1)
{
if(getFileList(&List))
{
printf("读取成功!\n");
}
else
{
printf("读取失败!\n");
printf("没有在程序目录找到“学生信息输入文件.txt”\n");
goto CHOICE;
}
break;
}
else if(choice==2)
{
printf("请输入要录入学生信息的个数:\n");
while(scanf("%d",&number))
{
int temp;
for(temp=1;temp<=number;temp++)
{
printf("----------------------------\n");
printf("第%d名同学\n",temp);
createLNode(&List);
printf("----------------------------\n");
if(temp==number)
{
printf("输入完成!请继续操作!\n");
}
}
break;
}
}
else
{
printf("输入有误!\n");
goto CHOICE;
}
break;
case 2:
if(!flag)
{
printf("你还未建立过学生信息表!\n");
break;
}
printf("你确定要删除吗?(1/0)\n");
int temp;
while(1)
{
fflush(stdin);
scanf("%d",&temp);
if(temp==1)
{
goto YES;
}
else if(temp==0)
{
printf("取消删除!\n");
goto NO;
}
else
{
printf("输入有误!请重新输入!\n");
}
}
YES: releaseList(&List);
printf("成功删除!\n");
NO: break;
case 3:
if(!judgeList(flag))
{
break;
}
displayList(List);
break;
case 4:
if(!judgeList(flag))
{
break;
}
LNode *student=searchList(List);
if(student==-1)
{
break;
}
if(!student)
{
printf("没有找到该学生!\n");
}
else
{
printLNode(student);
}
break;
case 5:
if(!judgeList(flag))
{
break;
}
int student_;
printf("请输入要查找学生信息序号:\n");
printf("(输入0取消操作返回上级)\n");
scanf("%d",&student_);
if(student_>Listlength||student_<0)
{
printf("没有该序号!查找失败!\n");
break;
}
else if(!student_)
{
break;
}
printLNode(serachLocation(List,student_));
break;
case 6:
if(!judgeList(flag))
{
printf("删除失败!\n");
break;
}
displayList(List);
delLNode(&List);
break;
case 7:
if(!judgeList(flag))
{
printf("插入失败!\n");
break;
}
displayList(List);
insertLNode(&List);
break;
case 8:
if(!flag)
{
printf("还没有创建学生信息表!\n");
}
else
{
printf("当前学生信息统计表共统计学生:%d人!\n",Listlength);
}
break;
case 9:
if(!judgeList(flag))
{
break;
}
printFileList(List);
printf("打印完成!文件存于程序目录!\n");
case 10:
goto END;
default:
printf("输入有误!\n");
break;
}
}
END:
printf("感谢您的使用,再见!\n");
releaseList(&List);
system("pause");
return 0;
}
/*CaptainUniverse_ 2022.3.18*/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)