数据结构第一次作业(学生信息管理系统-顺序表&&链表)

实验目的

1 、掌握线性表的定义;

2 、掌握线性表的基本操作,如建立、查找、插入和删除等。

实验内容:

定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(5) 给定一个学生信息,插入到表中指定的位置;

(6) 删除指定位置的学生记录;

(7) 统计表中学生个数。

 

参考信息

Definition of structure student

typedef struct {

    char no[8];   //8 位学号

    char name[20]; // 姓名

    int price;     // 成绩

}Student;

 

Definition of sequential list:

typedef  struct {

  Student  *elem;     // 指向数据元素的基地址

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

 }SqList

         

Definition of linked list

typedef struct LNode{

     Student   data;       // 数据域

     struct LNode  *next;   // 指针域

}LNode,*LinkList;  

 

 

实验要求

(1) 程序要添加适当的注释,程序的书写要采用 缩进格式

(2) 程序要具在一定的 健壮性,即当输入数据非法时, 程序也能适当地做出反应,如 插入删除时指定的位置不对 等等。

(3) 程序要做到 界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表 根据姓名进行查找的算法和插入算法的流程图


为了完成作业,就没好好做到界面友好,例如输入一些不合法的要求时,程序会陷入死循环

顺序表:

#include
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100

typedef int Status; // 定义函数返回值类型

typedef struct
{
	char num[10]; // 学号
	char name[20]; // 姓名
	double grade; // 成绩 
}student;

typedef student ElemType;

typedef struct
{
	ElemType *elem; // 存储空间的基地址 
	int length; // 当前长度 
}SqList;

Status InitList(SqList *L) // 构造空的顺序表 L 
{	
	L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
	if(!L->elem)  exit(OVERFLOW);
	L->length=0;
	return OK;
}

ElemType GetElem(SqList &L,int i) // 访问顺序表,找到 i位置,返回给 e
{
	return L.elem[i];
}

int Search(SqList &L,char str[]) // 根据名字查找,返回该同学在顺序表中的编号 
{
	for(int i=1;i<=L.length;i++)
	{
		if(strcmp(L.elem[i].name,str)==0)
			return i;
	}
	return 0;
}

Status ListInsert(SqList &L,int i,ElemType e) // 在 i位置插入某个学生的信息 
{
	if((i<1)||(i>L.length+1))	return ERROR;
	if(L.length==MAXSIZE)	return ERROR;
	for(int j=L.length;j>=i;j--)
	{
		L.elem[j+1]=L.elem[j];
	}
	L.elem[i]=e;
	++L.length;
	return OK;
}

Status ListDelete(SqList &L,int i) // 在顺序表中删除 i位置的学生信息 
{
	if((i<1)||(i>L.length))	return ERROR;
	for(int j=i;j<=L.length;j++)
	{
		L.elem[j]=L.elem[j+1];
	}
	--L.length;
	return OK;
}

void Input(ElemType *e)
{
	printf("姓名:");	scanf("%s",e->name);
	printf("学号:");	scanf("%s",e->num);
	printf("成绩:");	scanf("%lf",&e->grade);
	printf("输入完成\n\n");
}

void Output(ElemType *e)
{
	printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n",e->name,e->num,e->grade);
}

int main()
{
	SqList L;
	ElemType a,b,c,d;
	printf("\n********************************\n\n");
	puts("1. 构造顺序表"); 
	puts("2. 录入学生信息");
	puts("3. 显示学生信息");
	puts("4. 输入姓名,查找该学生");
	puts("5. 显示某位置该学生信息"); 
	puts("6. 在指定位置插入学生信息");
	puts("7. 在指定位置删除学生信息");
	puts("8. 统计学生个数");
	puts("0. 退出");
	printf("\n********************************\n\n");
	int x,choose;
	while(1)
	{
		puts("请选择:");
		scanf("%d",&choose);
		if(choose==0)	break;
		switch(choose)
		{
			case 1:
					if(InitList(&L))
						printf("成功建立顺序表\n\n");
					else
						printf("顺序表建立失败\n\n");
					break;
			case 2:
					printf("请输入要录入学生的人数(小于100):");
					scanf("%d",&x);
					for(int i=1;i<=x;i++)
					{
						printf("第%d个学生:\n",i);
						Input(&L.elem[i]);
					}
					L.length=x;
					puts("");
					break;
			case 3:
					for(int i=1;i<=x;i++)
					{
						a=GetElem(L,i);
						Output(&a);
					}
					break;
			case 4:
					char s[20];
					printf("请输入要查找的学生姓名:");
					scanf("%s",s);
					if(Search(L,s))
						Output(&L.elem[Search(L,s)]);
					else
						puts("对不起,查无此人");
					puts("");
					break;
			case 5:
					printf("请输入要查询的位置:");
					int id1;
					scanf("%d",&id1);
					b=GetElem(L,id1);
					Output(&b);
					break;
			case 6:
					printf ("请输入要插入的位置:");
					int id2;
					scanf("%d",&id2);
					printf("请输入学生信息:\n");
					Input(&c);
					if(ListInsert(L,id2,c))
					{
						x++;
						puts("插入成功");
						puts("");
					}
					else
					{
						puts("插入失败");
						puts("");	
					}
					break;
			case 7:
					printf("请输入要删除的位置:");
					int id3;
					scanf("%d",&id3);
					if(ListDelete(L,id3))
					{
						x--;
						puts("删除成功");
						puts("");
					}
					else
					{
						puts("删除失败");
						puts("");	
					}
					break;
			case 8:
					printf("已录入的学生个数为:%d\n\n",L.length);
					break;
		}
	}
	printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");
	system("pause");
	return 0;
}


链表:

#include
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;	// 定义函数返回值类型 

typedef struct
{
	char num[10]; // 学号
	char name[20]; // 姓名
	double grade; // 成绩 
}student;

typedef student ElemType;

typedef struct LNode
{
	ElemType data; // 数据域
	struct LNode *next; //指针域 
}LNode,*LinkList;

Status InitList(LinkList &L) // 构造空链表 L 
{
	L=(struct LNode*)malloc(sizeof(struct LNode));
	L->next=NULL;
	return OK;
}

Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到 i位置的数据域,返回给 e 
{
	LinkList p;
	p=L->next;
	int j=1;
	while(p&&jnext;
		++j;
	}
	if(!p||j>i)	return ERROR;
	e=p->data;
	return OK;
}

Status Search(LNode L,char str[],LinkList &p) // 根据名字查找 
{
	p=L.next; 
	while(p)
	{
		if(strcmp(p->data.name,str)==0)
			return OK;
		p=p->next;
	}
	return ERROR;
}

Status ListInsert(LinkList L,int i,ElemType e) // 在 i个位置插入某个学生的信息 
{
	LinkList p,s;
	p=L;
	int j=0;
	while(p&&jnext;
		++j;
	}
	if(!p||j>i-1)	return ERROR;
	s=(struct LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;
}

Status ListDelete(LinkList p,int i) // 删除 i位置的学生信息 
{
	int j=0;
	while((p->next)&&(jnext;
		++j;
	}
	if(!(p->next)||(j>i-1))	return ERROR;
	LinkList q;
	q=p->next;
	p->next=q->next; 
	delete q;
	return OK;
}

void Input(ElemType *e)
{
	printf("姓名:");	scanf("%s",e->name);
	printf("学号:");	scanf("%s",e->num);
	printf("成绩:");	scanf("%lf",&e->grade);
	printf("输入完成\n\n");
}

void Output(ElemType *e)
{
	printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n",e->name,e->num,e->grade);
}

int main()
{
	LNode L;
	LinkList p;
	ElemType a,b,c,d;
	printf("\n********************************\n\n");
	puts("1. 构造链表"); 
	puts("2. 录入学生信息");
	puts("3. 显示学生信息");
	puts("4. 输入姓名,查找该学生");
	puts("5. 显示某位置该学生信息"); 
	puts("6. 在指定位置插入学生信息");
	puts("7. 在指定位置删除学生信息");
	puts("8. 统计学生个数");
	puts("0. 退出");
	printf("\n********************************\n\n");
	int x,choose=-1;
	while(choose!=0)
	{
		puts("请选择:");
		scanf("%d",&choose);
		switch(choose)
		{
			case 1:
					if(InitList(p))
						printf("成功建立链表\n\n");
					else
						printf("链表建立失败\n\n");
					break;
			case 2:
					printf("请输入要录入学生信息的人数:");
					scanf("%d",&x);
					for(int i=1;i<=x;i++)
					{
						printf("第%d个学生:\n",i);
						Input(&a);
						ListInsert(&L,i,a);
					}
					break;
			case 3:
					for(int i=1;i<=x;i++)
					{
						GetElem(&L,i,b);
						Output(&b);
					}
					break;
			case 4:
					char s[20];
					printf("请输入要查找的学生姓名:");
					scanf("%s",s);
					if(Search(L,s,p))
						Output(&(p->data));
					else
						puts("对不起,查无此人");
					puts("");
					break;
			case 5:
					printf("请输入要查询的位置:");
					int id1;
					scanf("%d",&id1);
					GetElem(&L,id1,c);
					Output(&c);
					break;
			case 6:
					printf ("请输入要插入的位置:");
					int id2;
					scanf("%d",&id2);
					printf("请输入学生信息:\n");
					Input(&d);
					if(ListInsert(&L,id2,d))
					{
						x++;
						puts("插入成功");
						puts("");
					}
					else
					{
						puts("插入失败");
						puts("");	
					}
					break;
			case 7:
					printf("请输入要删除的位置:");
					int id3;
					scanf("%d",&id3);
					if(ListDelete(&L,id3))
					{
						x--;
						puts("删除成功");
						puts("");
					}
					else
					{
						puts("删除失败");
						puts("");	
					}
					break;
			case 8:
					printf("已录入的学生个数为:%d\n\n",x);
					break;
		}
	}
	printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");
	system("pause"); 
	return 0;
}

你可能感兴趣的:(杂七杂八)