您的位置:首页 > 其它

P318_118 合并两个链表,并按照学号升序排列。用类冒泡排序法对链表进行排序

2014-08-29 22:26 591 查看
用类冒泡排序法对链表进行排序;
再合并两个链表,并按照学号升序排列。

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <string.h>

#define LEN sizeof(STUDENT)
#define STU STUDENT
typedef struct//结构体定义
{
long snum;
char sname[10];
char ssex;
int sage;
struct STUDENT*next;
}STUDENT;

void print(STUDENT *head)//输出打印链表
{
STUDENT *p1;
p1 = head;
while(p1!=NULL)
{
printf("snum:%ld",p1->snum);
printf("\nsname:");
puts(p1->sname);
printf("ssex:%c",p1->ssex);
printf("\nsage:%d\n",p1->sage);
p1 = p1->next;
}
}

STUDENT * create(int n)//创建链表
{
STUDENT*p1,*p2,*head;
int i = 0;
for(i = 0;i <n;i++)
{
printf("input the %d students'info:\n",i+1);
p1 = (STUDENT *)malloc(LEN);
printf("snum:");
scanf("%ld",&p1->snum);
printf("sname:");
getchar();
gets(p1->sname);
printf("ssex:");
scanf("%c",&p1->ssex);
printf("sage:");
scanf("%d",&p1->sage);
if(i==0) {p2 = head = p1;}
else
{
p2->next = p1;
p2 =p2->next;
}
p1 = (STUDENT *)malloc(LEN);
}//for
p2->next =NULL;
free(p1);
return head;
}//create

STUDENT * sort(STUDENT *head)//链表内部排序,此次C语言练习的突破点
{
STU*p0,*p1,*p2,*temp;
p1 = head;
p0 = temp = p1;
while(p1 != NULL)
{
temp = p2 = p1->next;
while(p2 != NULL)
{
if(p1->snum >= p2->snum)
{
if(head==p1)
{
head = p1->next;
p1->next = p2->next;
p2->next = p1;
}
else
{
p0->next = p1->next;
p1->next = p2->next;
p2->next = p1;

}//if_head_else

p0 = p2;
p2 = p1->next;
}
else
{
p2 = p2->next;
}
}//while_p2
p1 = temp;
if(p1==head) p0 =p1;//多次回溯,进行头结点排序,直到出现最小结点为头结点
else
{ //寻找p1的前一个结点
p0 =head;
while(p0->next!=p1) p0 = p0->next;
}
}//while_p1
return head;
}//sort

STUDENT *concatList(STUDENT *ahead,STUDENT *bhead)//升序排列
{
STUDENT*p,*pa,*pb;
if(ahead==NULL) returnbhead;
else if(bhead==NULL)return ahead;
else if(ahead->snum<=bhead->snum)//将ahead和bhead指向同一个结点,用于函数返回值,p、pa、pb用于遍历操作
{
pa = ahead->next;
pb = bhead;
bhead = p = ahead;
}
else
{
pa = ahead;
pb = bhead->next;
ahead = p = bhead;
}

while(pa&&pb)
{
if(pa->snum <= pb->snum)
{
p->next= pa;
p =pa;
pa =pa->next;
}
else
{
p->next= pb;
p =pb;
pb =pb->next;
}
}//while_pa&&pb
p->next =pa?pa:pb;

return ahead;
}//concatList

int main()
{
int n;
printf("In LIST_a howmany student nodes you want to create?\n");
scanf("%d",&n);
STUDENT *ahead =sort(create(n));
printf("In LIST_b howmany student nodes you want to create?\n");
scanf("%d",&n);
STUDENT *bhead =sort(create(n));
ahead =concatList(ahead,bhead);
printf("New List is:\n");
print(ahead);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐