数据结构与算法(C语言实现) 2.链表的综合 *** 作

数据结构与算法(C语言实现) 2.链表的综合 *** 作,第1张

实验二  链表的综合 *** 作


一、实验目的

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*/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/563403.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-02
下一篇 2022-04-02

发表评论

登录后才能评论

评论列表(0条)

保存