数据结构与算法(C语言实现) 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 {

    Student  *elem;     //指向线性表的基地址

    int  length;        //线性表的当前长度

}SqList;


头文件及宏定义:

/*CaptainUniverse_ 2022.3.7*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
#define TRUE 1
#define FALSE 0
/*CaptainUniverse_ 2022.3.7*/

子函数声明:

/*CaptainUniverse_ 2022.3.7*/
Status createList(SqList *);//创建新的信息表  返回值表成功与否 (内存分配是否成功) 
Status displayList(SqList *);//展示信息表内容 返回值表成功与否 (是否建立过信息表及信息表内是否有内容) 
Status searchList(SqList *);//查找学生信息 返回值表查找的学生序号(可能超过学生个数表示没找到)或者取消查找(返回上一级) 
void printList(SqList *,int);//打印单个学生信息 
void delList(SqList *);//删除单个学生信息 
void insertList(SqList *);//插入单个学生信息 
void getList(SqList *,int);//输入单个学生信息 
void releaseList(SqList *);//释放占用内存 
void printFileList(SqList *);//信息表内容输出为文件 
Status getFileList(SqList *);//信息表内容以文件输入 
void screen(void);//操作提示 
/*CaptainUniverse_ 2022.3.7*/

子函数主体:

/*CaptainUniverse_ 2022.3.7*/
Status createList(SqList *List)
{
	
	if(flag)
	{
		printf("你已创建过学生信息表了!\n");
		return FALSE;
	}
	
	List->elem=(Student *)calloc(MAX,sizeof(Student));
	if(List->elem==NULL)
	{
		printf("内存分配失败!\n");
		exit(1);
	}
	flag=1;
	return TRUE;
}

Status displayList(SqList *List)
{
	if(!flag)
	{
		printf("还没有创建学生信息表!\n");
		return FALSE;
	}
	if(!List->length&&flag)
	{
		printf("此表已空,请删除后重新建表!\n");
		return FALSE;
	}
	int temp;
	for(temp=1;temp<=List->length;temp++)
	{
		putchar('\n');
		printf("第%d名同学:\n",temp);
		printList(List,temp);
	}
	return TRUE;
}

Status searchList(SqList *List)
{
	int temp=1;
	char t_name[20],t_no[12];
	int t_choice;
	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 FALSE;
			case 1:
				printf("请输入要查找的学生姓名:\n");
				scanf("%s",t_name);
				while(temp<=List->length&&strcmp(t_name,List->elem[temp].name)!=0)
				{
					temp++;
				}
				return temp;
				break;
			case 2:
				printf("请输入要查找的学生学号:\n");
				scanf("%s",t_no);
				while(temp<=List->length&&strcmp(t_no,List->elem[temp].no)!=0)
				{
					temp++;
				}
				return temp;
				break;
			default:
				printf("输入有误!\n");
				break; 
		}
	}	
}

void printList(SqList *List,int temp)
{
	printf("-----------------\n");
	printf("姓名:%s\n",List->elem[temp].name);
	printf("学号:%s\n",List->elem[temp].no);
	switch(List->elem[temp].xb)
	{
		case 'M':
			printf("性别:男\n");
			break;
		case 'W':
			printf("性别:女\n"); 
			break;
	}
	printf("年龄:%d\n",List->elem[temp].age);
	printf("-----------------\n");
	putchar('\n');
}

void delList(SqList *List)
{
	if(!displayList(List))
	{
		return;
	}
		int temp;
		printf("请输入删除的学生序号:\n");
		printf("(输入0取消操作返回上级)\n");
		while(scanf("%d",&temp))
		{
			if(!temp)
			{
				return;
			}
			if(temp>0&&temp<=List->length)
			{
				for(temp;temp<List->length;temp++)
				{
					List->elem[temp]=List->elem[temp+1];
				}
				List->length--;
			
				printf("删除成功!\n");
				return;
			}
			else
			{
				printf("没有该学号!删除失败!\n");
				return;
			}
		}	
}

void insertList(SqList *List)
{
	if(!displayList(List))
	{
		return;
	}
	if(List->length==MAX)
	{
		printf("超出信息表上限,插入失败!\n");
		return;
	}
	
	int temp_1,temp_2;
	
	printf("请输入学生插入到的序号:\n");
	printf("(输入0取消操作返回上级)\n");
	scanf("%d",&temp_1);
	if(!temp_1)
	{
		return;
	}
	if(temp_1>0&&temp_1<=List->length)
	{
			for(temp_2=List->length;temp_2>=temp_1;temp_2--)
			{
				List->elem[temp_2+1]=List->elem[temp_2];
			}
			getList(List,temp_1);
			List->length++;
		
			printf("插入成功!\n");
			return;
	}
	else
	{
		printf("插入失败!\n");
		return;
	}
	
}

void getList(SqList *List,int temp)
{
		printf("请输入学生姓名:\n");
		scanf("%s",List->elem[temp].name);
		printf("请输入该学生学号:\n");
		scanf("%s",List->elem[temp].no);
		printf("请输入学生年龄:\n");
		scanf("%d",&List->elem[temp].age);
		printf("请输入学生性别(W为女 M为男):\n");
		getchar();
		scanf("%c",&List->elem[temp].xb);
}

void releaseList(SqList *List)
{
	free(List->elem);
}

void printFileList(SqList *List)
{
	Student student;
	FILE *fp;
	int temp;
	if((fp=fopen("学生信息统计表.txt","w"))==NULL)
	{
		printf("打开文件失败!\n");
		return;
	}
	fputs("序号\t姓名\t\t学号\t\t性别\t年龄\t\n\n",fp);
	for(temp=1;temp<=List->length;temp++)
	{	
		fprintf(fp,"%d\t",temp);
		fprintf(fp,"%s\t",List->elem[temp].name);
		fprintf(fp,"%s\t",List->elem[temp].no);
		if(List->elem[temp].xb=='W')
		{
			fputs("女",fp);
		}
		else
		{
			fputs("男",fp);
		}
		fputs("\t", fp);
		fprintf(fp,"%d",List->elem[temp].age); 
		fputc('\n', fp);
	}
	fclose(fp);
	
}

Status getFileList(SqList *List)
{
	Student student;
	FILE *fp;
	int temp=1;
	if((fp=fopen("学生信息输入文件.txt","r"))==NULL)
	{
		fclose(fp);
		return EXIT_FAILURE;
	}
	while(!feof(fp))
	{	
		fscanf(fp,"%s\t%s\t%c\t%d",&List->elem[temp].name,&List->elem[temp].no,&List->elem[temp].xb,&List->elem[temp].age);
		List->length++;
		temp++;
	}
	fclose(fp);
	return EXIT_SUCCESS;
}

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');
}
/*CaptainUniverse_ 2022.3.7*/

主函数:

/*CaptainUniverse_ 2022.3.7*/
int main(void)
{
	SqList List;
	int Choice;
	List.length=0;
	
	while(1)
	{
		screen();
		printf("请输入操作序号:\n");
		fflush(stdin);
		scanf("%d",&Choice);
		switch(Choice)
		{
			case 1:
				if(createList(&List))
				{
					printf("建立成功!\n");
					int number,Choice_;
CHOICE:				printf("1.以文件输入\n");
					printf("2.手动输入\n");
			  		printf("请选择:\n");
					scanf("%d",&Choice_);
					if(Choice_==1)
					{
						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(!getFileList(&List))
						{
							printf("读取成功!\n");
						}
						else
						{
							printf("读取失败!\n");
							printf("没有在程序目录找到“学生信息输入文件.txt”\n");
							goto CHOICE;
						}
						break;
					}
					else if(Choice_==2)
					{
						printf("请输入要录入学生信息的个数(1-1000):\n");
						while(scanf("%d",&number))
						{
							if(number>MAX)
						{
							printf("超出学生个数上限!请重新输入!\n");
						}
						else
						{
							int temp;
							for(temp=1;temp<=number;temp++)
							{
								printf("----------------------------\n");
								printf("第%d名同学\n",temp);
								getList(&List,temp);
								List.length++;
								printf("----------------------------\n");
								if(temp==number)
								{
									printf("输入完成!请继续操作!\n");
								}
								
						 	}
						 	break;
						}
						
						}
					}
					else
					{
						printf("输入有误!\n");
						goto CHOICE;	
					}			
				}
				else
				{
					printf("建立失败!\n");
				}
				break;
			case 2:
				if(!flag) 
				{
					printf("你还没有建立过信息表!\n");
					break;
				}
				releaseList(&List);
				List.length=0;
				printf("成功删除!\n");
				flag=0;
				break;
			case 3:
				displayList(&List);
				break;
			case 4:
				if(!flag)
				{
					printf("你还没有建立过信息表!\n");
					break;
				}
				if(flag&&!List.length)
				{
					printf("此表已空,请删除后重新建表!\n");
					break;
				}
				int student;
				student=searchList(&List);
				if(!student)
				{
					break;
				}
				if(student>List.length)
				{
					printf("未找到此学生!\n");
				}
				else
				{
					printList(&List,student);
				}
				break;
			case 5:
				if(!flag)
				{
					printf("你还没有建立过信息表!\n");
					break;
				}
				int student_;
				printf("请输入要查找学生信息序号:\n");
				printf("(输入0取消操作返回上级)\n");
				scanf("%d",&student_);
				if(student_>List.length)
				{
					printf("没有该序号!查找失败!\n");
					break; 
				}
				else if(!student_)
				{
					break;
				}
				printList(&List,student_);
				break;
			case 6:
				delList(&List);
				break;
			case 7:
				insertList(&List);
				break;
			case 8:
				if(!flag)
				{
					printf("还没有创建学生信息表!\n");
				}
				else
				{
					printf("当前学生信息统计表共统计学生:%d人!\n",List.length);
				}
				break;	
			case 9:
				if(!flag)
				{
					printf("还没有创建学生信息表!\n");
					break;
				}
				if(!List.length)
				{
					printf("此表为空!打印失败!\n");
					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.7*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值