有关链表的问题大家可以看参考下面这个链接
https://blog.csdn.net/qq_44614524/article/details/87396806
/*一条记录有学生姓名、学号、成绩三个数据项,
创建两个顺序表存放学生信息,
通过键盘输入学生信息(成绩不递减);
将两个表合并成一个有序表,并打印出来。
提示:
编写创建链表函数CreateList,分别采用头插、
尾插法创建链表;
插入函数ListInsert,显示函数ShowList,
合并函数MergeList.*/
#include<string.h>
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int score;
char name[100];
int number; //数据域
struct node *next; //指针域指向后继结点
}LinkList; //节点
typedef struct node *Linklist; //结构指针
/*
void creat_list(LinkList **head) //头插法建表
{
Linklist s;
int i;
int flag = 1;
(*head) = (Linklist)malloc(sizeof(LinkList)); //创建头节点
(*head) -> next = NULL; //头结点指针域置空
while(flag == 1)
{
s = (Linklist)malloc(sizeof(LinkList)); //新节点申请内存
puts("请输入学生学号,成绩,姓名");
scanf("%d%d%s", &s -> number, &s -> score, s -> name);
s -> next = (*head) -> next; //新节点插在头节点之前
(*head) -> next = s;
fflush(stdin);
puts("继续录入请输入1,否则按任意键");
scanf("%d", &flag);
}
} */
void creat_list(Linklist *head)
{
Linklist s, r;
int i;
(*head)= (Linklist)malloc(sizeof(LinkList));
r = (*head);
int flag = 1;
while(flag == 1)
{
s = (Linklist)malloc(sizeof(LinkList)); //创建头节点
puts("请输入学生学号,成绩,姓名");
scanf("%d%d%s", &s -> number, &s -> score, s -> name);
r -> next = s; //新节点插入到头结点之后
r = s;
fflush(stdin);
puts("继续录入请输入1,否则按任意键");
scanf("%d", &flag);
}
r -> next = NULL; //尾节点指针域置空
}
void insert(Linklist *head)
{
Linklist p, pnew;
p = (*head);
char _name[20];
puts("请输入要插入节点之前的学生姓名");
scanf("%s", _name);
puts("请输入要插入学生的学号、成绩、姓名");
pnew = (Linklist)malloc(sizeof(LinkList));
scanf("%d%d%s", &pnew -> number, &pnew -> score, pnew -> name);
while(p)
{
if(strcmp(p -> name, _name) == 0)
{
pnew -> next = p -> next;
p -> next = pnew;
}
p = p -> next;
}
}
void print(Linklist head) //打印链表中的数据
{
Linklist s;
s = head -> next; //s指向第一个有数据的节点
while(s)
{
printf("学号\t成绩\t姓名\n");
printf("%d\t%d\t%s\n", s -> number, s -> score, s -> name);
s = s -> next; //指针后继
}
}
int main()
{
Linklist head;
creat_list(&head);
insert(&head);
print(head);
return 0;
}
运行结果如下,学生的相关信息由自己输入