已知带头结点单链表L,设计算法实现:以表中第一个元素作为标准,将表中所有值小于第一个元素 的结点均放在第一个结点之前 ,所有值大于 第一个元素的结点均放在第一个元素结点之后。(可参照耿教授的教材第73页,例2.8的算法)
要求完成以下要点:
1、描述单链表的存储结构定义;
2、创建单链表的算法;
3、完成本题目要求的算法;
4、测试本题正确执行的测试主函数main();
5、设计测试用例(输入的测试数据);
6、测试结果(可将输出结果截图)
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
/* 节点结构定义 */
typedef struct Node{
int data;
struct Node *next;
}Node,* LinkList;
/* 建立单链表 */
LinkList creatList(LinkList L,int n){
Node *p,*q;
int i;
L=(LinkList)malloc (sizeof(Node));/* 建立头结点 */
L->next=NULL;/* 建立空表 */
p=(LinkList)malloc(sizeof (Node));
printf(" 第1个节点的值:");
scanf("%d",&(p->data));
p->next=L->next;
L->next=p;
q=p;/* 插入第一个结点,for语句插入剩余结点*/
for(i=n-1;i>0;i--){
p=(LinkList)malloc (sizeof(Node));
printf(" 第%d个节点的值:",n+1-i);
scanf("%d",&(p->data));
p->next=q->next;
q->next=p;
q=p;
}
return L;
}
void show(LinkList L){
Node *p;
for(p=L->next;p!=NULL;p=p->next){
printf(" %d ",p->data);
}
}
/*比较,根据La的值输入到Lb中
1、a<b
2、a=b
3、a>b
*/
LinkList compare(LinkList La,LinkList Lb){
Node *p,*q,*r;
LinkList Lc;
p=La->next;
q=Lb->next;
Lc=La;
Lc->next=NULL;
r=Lc;
while ( p!=NULL && q!=NULL ){
if(p->data<=q->data){
r->next=p;
r=p;
p=p->next;
}
else{
r->next=q;
r=q;
q=q->next;
}
if(p){r->next=p;}
else{r->next=q;}
}
return (Lc);
}
main(){
LinkList La,Lb,Lc;
La=creatList(La,3);
printf("La 输入的值依次为:\n");
show(La);
printf("\n");
Lb=creatList(Lb,3);
printf("Lb 输入的值依次为:\n");
show(Lb);
Lc=compare(La,Lb);
printf("\n输入的值依次为:\n");
show(Lc);
getch();
return 0;
}