要求:
(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); //退出系统
}
}
}
有错请指正!