4、已有两个链表x和y,每个链表的结点包括学号和成绩,要求把两个链表合并,按学号升序排列。
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
typedef struct list
{
int num;
int score;
struct list *pNext;
}*plist;
plist list1(plist headx)
{
int num,score;
plist p;
for(int i=0;i<5;i++)
{
scanf("%d %d",&num,&score);
if(headx == NULL) //指针如果未被初始化,不是说就是等于NULL了。
{
headx = (plist)malloc(sizeof(list));
headx->num = num;
headx->score = score;
headx->pNext = NULL; //这里要为下一步考虑
}
else
{
p=headx;
while (p->pNext != NULL)
{
p = p->pNext; //找到等于NULL的位置
}
p->pNext = (plist)malloc(sizeof(list));
p->pNext->num = num;
p->pNext->score = score;
p = p->pNext;
p->pNext = NULL;
}
}
return headx;
}
plist list2(plist heady)
{
int num,score;
plist p=heady;
for(int i=0;i<5;i++)
{
scanf("%d %d",&num,&score);
if(heady == NULL)
{
heady = (plist)malloc(sizeof(list));
heady->num = num;
heady->score = score;
heady->pNext = NULL;
}
else
{
p=heady;
while (p->pNext != NULL)
{
p = p->pNext;
}
p->pNext = (plist)malloc(sizeof(list));
p->pNext->num = num;
p->pNext->score = score;
p = p->pNext;
p->pNext = NULL;
}
}
return heady;
}
void query(plist p,plist heady) //查找到x链表的尾结点,为了与y链表对接
{
while (p->pNext != NULL)
{
p = p->pNext;
}
p->pNext = heady; //实现了链表的对接。如果是return p->pNext;然后在main函数中再对其对接是错误的,
//因为return返回的是NULL
}
void sort_p(plist headx) // 冒泡排序实现学号的升序 记住成绩也要跟着交换
{
int temp1,temp2;
for(int i=0;i<9;i++)
{
plist p = headx;
while(p->pNext->pNext != NULL)
{
if(p->pNext->num > p->pNext->pNext->num)
{
temp1 = p->pNext->num;
temp2 = p->pNext->score;
p->pNext->score = p->pNext->pNext->score;
p->pNext->num = p->pNext->pNext->num;
p->pNext->pNext->num = temp1;
p->pNext->pNext->score = temp2;
}
p = p->pNext;
}
}
}
void out(plist p) //输出两个链表
{
while(p != NULL)
{
printf("%d %d\n",p->num,p->score);
p = p->pNext;
}
}
int main()
{
plist headx=NULL,heady=NULL;
headx = list1(headx); //记住要把headx和heady返回出来,否则是不能改变的,因为在函数中的赋值是静态的
heady = list2(heady);
query(headx,heady);
sort_p(headx);
out(headx);
return 0;
}
或者还可以这样写,更简单
直接把整个区域指针交换
stu Sort(stu head)
{
stu p,h,tail=NULL;
h=(stu)malloc(sizeof(student));
while(head->next!=tail) //类似于冒泡排序
{
h=head;
p=h->next;
while(p!=tail&&p->next!=tail)
{
if(p->num > p->next->num)
{
h->next=p->next;
p->next=p->next->next;
h->next->next=p;
}
h=h->next;
p=h->next;
}
tail=p;
}
return head;
}
创建链表其实更简单
stu create()
{
int i,j,n;
stu h,p,q;
h=p=(stu)malloc(sizeof(node));
printf("输入几个信息:\n");
scanf("%d",&n);
for (i=0;i<n;i++)
{
p->next=(stu)malloc(sizeof(node));
scanf("%d%d",&p->next->num,&p->next->score);
p = p->next;
}
p->next = NULL;
return h;
}