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;
}
再合并两个链表,并按照学号升序排列。
#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;
}
相关文章推荐
- 有a,b两个已按学号升序排序的链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,仍按学号升序排列。
- 有a,b两个已按学号升序排序的链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,仍按学号升序排列。
- 已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。
- 对一个存储学生信息的单向链表,按照学号升序对链表进行排序,每个节点包含了一个学生ID
- 已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并。按学号升序排列.
- 已有 a、b 两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按成绩升序排列。
- 已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。
- 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列
- 已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。
- 数据结构中线性表的基本操作-合并两个线性表-按照元素升序排列
- 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然按照递增排序
- 程序员常见面试题之合并两个升序排列的链表
- 用C语言编写一个双链表,每个结点存储学生的编号以及姓名,遍历这个双链表,并将学号按照从小到大进行排序
- 将两个升序排列的单链表合并为一个降序排列的单链表且不增加新的结点
- C++实现两个已经排序的链表进行合并
- 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的
- 请通过代码实现以下功能:输入一个5X5的二维数组,将数组进行排序,其中一维数组按照平均值降序,一维数组内部升序排列。
- 用面向对象解决:输入一个5X5的二维数组,将数组进行排序,其中一维数组按照平均值降序,一维数组内部升序排列
- 将两个升序排列的链表合并后升序排序打印.
- C# 数组按照升序排列并输出(分别用冒泡法,选择法,插入法进行排序)。