我把成绩看成了姓名,不过对题目没什么影响;
主要思路:
1.先创建两个链表;
2.把两个链表合并;
3.把合并后的链表排序;
4.输出排序后的链表
具体处理:
1.如何创建链表:
链表 = 头指针 + 节点
所以:首先,定义节点
typedef struct node
{
int sid;
char name[20];
struct node* next;
}node;
然后就把节点连起来,形参n是要创建的链表长度,函数返回头指针;
node* creatlink(int n)
{
node* p = (node* )malloc(sizeof(node)); //创建头指针
node* p2 = NULL;
while(n--)
{
node* nod = (node*)malloc(sizeof(node));//创建节点
printf("请输入链队的节点的内容(学号 姓名):\n");
scanf("%d %s", &nod->sid, nod->name);
if (p2 == NULL) //头指针指向第一个节点
{
p2 = nod;
p->next = nod;
}
else
{
p2->next = nod;
p2 = nod;
}
}
p2->next = NULL;
return p;
}
2.把两个链表合并;
只要让a链表的尾节点指向b链表的头结点,然后释放掉b就可以了
3.排序:用最熟悉的选择排序就好
我把2,3写在了一个函数里:
void mergelink(node* a, node* b)
{
node* tail = a;
node* i = NULL;
node* j = NULL;
node t;
while(tail->next != NULL) //找到a的尾节点
{
tail = tail->next ;
}
tail->next = b->next ; //让a的尾结点指向b的头结点
free(b); //释放掉
//注意:这里不要把b链表的节点释放掉,因为我们把b链表的节点连接到a链表上了
for(i = a->next; i != NULL; i = i->next) //选择排序
for(j = i->next; j != NULL; j = j->next)
{
if (i->sid > j->sid)
{
t.sid = i->sid;
i->sid = j->sid;
j->sid = t.sid;
strcpy(t.name, i->name);
strcpy(i->name, j->name);
strcpy(j->name, t.name);
}
}
}
4,打印链表
void printlink(node* c)
{
node* p = NULL;
for(p = c->next; p != NULL; p = p->next)
{
printf("%d %s\n", p->sid, p->name);
}
}
完整代码:
# include "stdio.h"
# include "stdlib.h"
# include "string.h"
typedef struct node
{
int sid;
char name[20];
struct node* next;
}node;
node* creatlink(int n);
void mergelink(node* a, node* b);
void printlink(node *c);
int main()
{
node* a = creatlink(2);
node* b = creatlink(2);
mergelink(a, b);
printlink(a);
return 0;
}
node* creatlink(int n)
{
node* p = (node* )malloc(sizeof(node));
node* p2 = NULL;
while(n--)
{
node* nod = (node*)malloc(sizeof(node));
printf("请输入链队的节点的内容(学号 姓名):\n");
scanf("%d %s", &nod->sid, nod->name);
if (p2 == NULL)
{
p2 = nod;
p->next = nod;
}
else
{
p2->next = nod;
p2 = nod;
}
}
p2->next = NULL;
return p;
}
void mergelink(node* a, node* b)
{
node* tail = a;
node* i = NULL;
node* j = NULL;
node t;
while(tail->next != NULL)
{
tail = tail->next ;
}
tail->next = b->next ;
free(b);
for(i = a->next; i != NULL; i = i->next)
for(j = i->next; j != NULL; j = j->next)
{
if (i->sid > j->sid)
{
t.sid = i->sid;
i->sid = j->sid;
j->sid = t.sid;
strcpy(t.name, i->name);
strcpy(i->name, j->name);
strcpy(j->name, t.name);
}
}
}
void printlink(node* c)
{
node* p = NULL;
for(p = c->next; p != NULL; p = p->next)
{
printf("%d %s\n", p->sid, p->name);
}
}