实验:线性表的操作(顺序表)C语言

要求:

  (1)假如有一个学生表,每个学生包含学号、姓名和分数。你如何设计相应的顺序表?

(2)如果对学生表进行插入、修改和删除运算,你如何设计相应的算法?

 

 

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h> 
#define MaxSize 10
 
struct Students//定义学生信息的结构体
{
	char name[20];//姓名
	long num;//学号
	int score;//分数
};
typedef Students ElemType;
 
typedef struct//定义学生链表
{
	ElemType data[MaxSize];
	int length;
}SqList;
 
void CreateList(SqList*&L, ElemType a[], int n)//创建显示信息链表
{
	int i = 0, k = 0;
	L = (SqList *)malloc(sizeof(SqList));
	while (i < n)
	{
		L->data[i] = a[i];
		i++;
		k++;
	}
	L->length = k;
}
int ListLength(SqList *L)//链表长度
{
	return(L->length);
}
void DispList(SqList*&L)//输出链表的各个元素
{
	printf("┏━━━━━━━━━━━──━━━━━━━━━──━─━━━━━━━┓\n");
	printf("┠───────────学生信息表────────────┨\n");
	for (int i = 0; i < L->length; i++)
	{
		printf("┃  %-7ld", L->data[i].num);
		printf("%-15s", L->data[i].name);
		printf("%3d      ┃\n", L->data[i].score);
		printf("\n");
	}
	printf("┗━━━━━━━━━━━━━━━━━──━━━━━──━─━━━━━┛\n");
}
 
bool ListInsert(SqList*&L, int i, ElemType &e)//插入新元素
{
	int j;
	if (i < 1 || i> L->length + 1)
		return false;
	i--;//逻辑序号转换成物理序号
	for (j = L->length; j > i; j--)
		L->data[j] = L->data[j - 1];
	L->data[i] = e;
	L->length++;
	return true;
}
bool ListDelete(SqList*&L, int i, ElemType &e)//删除指定序号的元素
{
	int j;
	if (i < 1 || i> L->length)
		return false;
	i--;
	e = L->data[i];
	for (j = i; j < L->length; j++)
		L->data[j] = L->data[j + 1];
	L->length--;
	return true;
}
int LocateElem(SqList*&L, long nm)//根据学号获得对应结点的序号
{
	int i = 0;
	while (i < L->length && L->data[i].num != nm)
		i++;
	if (i >= L->length)
		return 0;
	else
		return i++;
}
void showElem(Students &Stu)
{
	printf("%-7ld", Stu.num);
	printf("%-15s", Stu.name);
	printf("%d\n", Stu.score);
}
void RectifyElem(SqList*&L, int n)//修改对应学号的学生的信息
{
	printf("新学号:");
	scanf("%d", &L->data[n].num);
 
	printf("新姓名:");
	char Eat;
	scanf("%c", &Eat);
	int m;
	char ch;
	for (scanf("%c", &ch), m = 0; m < 20 && ch != '\n'; m++)
	{
		L->data[n].name[m] = ch;
		scanf("%c", &ch);
	}
	L->data[n].name[m] = '\0';
	printf("\n");
	printf("新成绩:");
	scanf("%d", &L->data[n].score);
}
 
int main()
{
	Students Stu[5] = { { "Li", 1001, 79 }, { "xiao", 1002, 78 }, { "wanng", 1003, 81 } ,{"ke",1004,99},{"hua",1005,96 } };
	SqList *L;
	Students a;
	int n,m,k;
	Students Stud2;
	long number;
	printf("***********************************\n");
	printf("	1.创建顺序表\n");
	printf("	2.输出元素\n");
	printf("	3.插入学生信息\n");
	printf("	4.删除学生信息\n");
	printf("	5.修改学生信息\n");
	printf("	0.退出系统\n");
	printf("***********************************\n");
	n = -1;
	while (n != 0) {
		printf("请选择功能:\n");
		scanf("%d", &n);
		switch (n)
		{
		case 1:           //创建顺序表   
			CreateList(L, Stu, 5);
			printf("创建成功!\n");
			break;
		case 2:          //输出个元素
			DispList(L);
			break;
		case 3:			//插入元素
					 printf("\n输入插入的位置:");
			scanf("%d", &m);
			printf("输入插入学生的姓名\n");
			scanf("%s", a.name);
			printf("输入插入学生的学号\n");
			scanf("%ld", &a.num);
			printf("输入插入学生的成绩\n");
			scanf("%d", &a.score);
			ListInsert(L, m, a);
			printf("依次输出新的排列:\n");
			break;
		case 4:	      //删除元素
			printf("\n\n输入删学生的信息序号:\n");
			scanf("%d", &m);
			ListDelete(L, m, Stud2);
			DispList(L);
			printf("\n\n被删去的学生的信息为:\n");
			showElem(Stud2);
			break;
		case 5:				//修改元素
			printf("请输入修改学生信息的学号:");
			scanf("%ld", &number);
			printf("\n");
			k = LocateElem(L, number);
			printf("修改学生的信息如下:\n");
			showElem(L->data[k]);
			RectifyElem(L, k);
			printf("输出修改后的学生的信息\n");
			DispList(L);
			break;
		case 0:exit(0); //退出系统  
 
 
		}
	}
}

有错请指正!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值