实验:线性表的操作(单链表)C语言

要求:

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

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

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h> 
#define MaxSize 50
struct Students//定义学生信息的结构体
{
	char name[MaxSize];//姓名
	long num;//学号
	int score;//分数
};
typedef Students ElemType;

typedef struct LNode//定义学生链表
{
	ElemType data;
	struct LNode *next;
}LinkNode;

void CreateList(LinkNode*&L, ElemType a[], int n)//创建显示信息链表(头插法)
{
	LinkNode *s, *r;
	L = (LinkNode *)malloc(sizeof(LinkNode));//创建头结点
	L->next = NULL;
	r = L;			//r始终指向尾结点,开始是指向头结点
	for (int i = 0; i < n; i++)  //循环建立数据结点s
	{
		s = (LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
		s->data = a[i];     //创建数据结点s
		r->next = s;        //将结点s插入r结点之后
		r = s;
	}
	r->next = NULL;       //尾结点的next域值为NULL
}
void InitList(LinkNode *&L)//初始化
{
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->next = NULL;
}
bool ListEmpty(LinkNode *L)//判断是否为空表
{
	return(L->next == NULL);
}
int ListLength(LinkNode *L)//链表长度
{
	int i = 0;
	LinkNode *p = L;
	while (p->next != NULL)
	{
		i++;
		p = p->next;
	}
	return i;
}
void DispList(LinkNode*&L)//输出链表的各个元素
{
	LinkNode *p = L->next;
	printf("┏━━━━━━━━━━━──━━━━━━━━━──━─━━━━━━━┓\n");
	printf("┠───────────学生信息表────────────┨\n");
	while(p!=NULL)
	{
		printf("┃  %-7ld", p->data.num);
		printf("%-15s", p->data.name);
		printf("%3d	  ┃\n", p->data.score);
		printf("\n");
		p = p->next;
	}
	printf("┗━━━━━━━━━━━━━━━━━──━━━━━──━─━━━━━┛\n");
}
bool GetElem(LinkNode *L, int i, ElemType &e)
{
	int j = 0;
	LinkNode *p = L;
	if (i <= 0)
		return false;
	while (j < i&&p != NULL)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
		return false;
	else
	{
		e = p->data;
		return true;
	}
}
bool ListInsert(LinkNode*&L, int i, ElemType &e)//插入新元素
{
	int j = 0;
	LinkNode *p = L, *s;
	if (i <= 0)
		return false;
	while (j < i - 1 &&p != NULL)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
		return false;
	else
	{
		s = (LinkNode*)malloc(sizeof(LinkNode));
		s->data = e;
		s->next = p->next;
		p->next = s;
		return true;
	}
}
bool ListDelete(LinkNode*&L, int i, ElemType &e)//删除指定序号的元素
{
	int j = 0;
	LinkNode*p = L, *q;
	if (i <= 0)
		return false;
	while (j < i - 1 && p != NULL)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
		return false;
	else
	{
		q = p->next;
		if (q ==NULL)
			return false;
		e = q->data;
		p->next = q->next;
		free(q);
		return true;
	}
}
int LocateElem(LinkNode*&L, ElemType e)//根据学号获得对应结点的序号
{
	int i = 1;
	LinkNode *p = L->next;
	while (p != NULL && p->data.num != e.num)
	{
		p = p->next;
		i++;
	}
	if (p == NULL)
		return false;
	else
		return i;

}
void ShowElem(ElemType &e)
{
	printf("%-7ld", e.num);
	printf("%-10s", e.name);
	printf("%d\n", e.score);
}
 void ReviseElem(LinkNode*&L, int n,ElemType &e)//修改对应学号的学生的信息
{
	
	
}

int main()
{
	LinkNode *L;
	Students a,b,c,num;
	Students Stu[5] = { { "Li", 1001, 79 }, { "xiao", 1002, 78 }, { "wanng", 1003, 81 } ,{"ke",1004,99},{"hua",1005,96 } };
	int n,m,k;
	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");
				DispList(L);//输出插入后的结果
				break;
			case 4:	      //删除元素
				printf("\n\n输入删学生的学号:\n");
				scanf("%d", &b.num);
				k = LocateElem(L, b);
				ListDelete(L, k, b);
				DispList(L);
				printf("\n\n被删去的学生的信息为:\n");
				ShowElem(b);
				break;
			case 5:				//修改元素
				printf("\n\n输入修改学生的学号:\n");
				scanf("%d", &b.num);
			    k=LocateElem(L, b);//学号转化为序号k
				printf("\n\n被修改的学生的信息为:\n");
				
				ListDelete(L, k, b);//删除序号k处的结点
				ShowElem(b);
				printf("输入新学生的姓名:\n");
				scanf("%s", a.name);
				printf("输入新学生的学号:\n");
				scanf("%ld", &a.num);
				printf("输入新学生的成绩:\n");
				scanf("%d", &a.score);
				ListInsert(L, k, a);//再在k处插入新结点以完成修改
				DispList(L);
				break;
			case 0:exit(0); //退出系统  
			

		}
	}
}

有错请指正!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值