由于编者时间以及水平有限,没有对输入的数据进行判断是否合法,有需要的可以加。 如有错误,敬请斧正 ʘᴗʘ
1.定义链表数据元素
typedef struct
{
char id[16];
char name[20];
double score;
} Student;
//定义一个学生类型,用Student作别名
typedef struct LNode
{
Student data;
struct LNode* next;/struct不能套用自身,但是指针就可以
} LNode, * LinkList;
1.2初始化链表(我不喜欢用这种)
为了美观,我选择在主函数初始化
LinkList InList(LinkList L)对整个结构体赋值,一个指针权限不够,要用多一个指针
{
L=(LinkList)malloc(sizeof(LNode));//创建一个头,从内存中查找出LNode大小的内存用malloc函数创建并转化成LinkList类型
L->next=NULL;
return L;
}
以下在主函数中添加
LinkList p,L;
L=InList(&p);
2.添加结点
①头插法
void CreatList_H(LinkList L)
{
LNode* newNode;
int i, n;
printf("你要添加多少个?");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
newNode = (LNode*)malloc(sizeof(LNode));
printf("请输入你要添加的学号:");
scanf("%s", &newNode->data.id);
printf("请输入你要添加的姓名:");
scanf("%s", &newNode->data.name);
printf("请输入你要添加的分数:");
scanf("%lf", &newNode->data.score);
newNode->next = L->next;
L->next = newNode;
}
}
②尾插法
void CreatList_E(LinkList L) {
LNode* newNode,*p;
int i, n;
printf("你要添加多少个?");
scanf("%d", &n);
p = L;
while (p->next!=NULL)//指针指向最后
{
p = p->next;
}
for (i = 0; i < n; i++)
{
newNode = (LNode*)malloc(sizeof(LNode));
printf("请输入你要添加的学号:");
scanf("%s", &newNode->data.id);
printf("请输入你要添加的姓名:");
scanf("%s", &newNode->data.name);
printf("请输入你要添加的分数:");
scanf("%lf", &newNode->data.score);
newNode->next = NULL;
p->next = newNode;
p = newNode;
}
}
3.修改结点
void ReviseStudent(LinkList L) {
LNode* p;
char x[20];
p = L->next;
printf("你想修改的学生学号是什么?");
scanf("%s", &x);
while (p != NULL)
{
if (strcmp(x, p->data.id) == 0) {
printf("新修改后的学号是?");
scanf("%s", &p->data.id);
printf("新修改后的姓名是?");
scanf("%s", &p->data.name);
printf("新修改后的分数是?");
scanf("%lf", &p->data.score);
printf("修改成功成功\n");
return;
}
p = p->next;
}
printf("不存在这个学生");
}
4.插入结点
void InsertStudent(LinkList L){
LNode* p, *q,*new;
p = L;
q = p->next;
char x[20];
int y;
new = (LNode*)malloc(sizeof(LNode));
printf("你想插在谁的学号前面?");
scanf("%s", &x);
while (q!=NULL)
{
if (strcmp(x, q->data.id) == 0) {
printf("你想插入的学号是什么?");
scanf("%s", &new->data.id);
printf("你想插入的姓名是什么?");
scan