已知带头结点单链表L,设计算法实现:以表中第一个元素作为标准,将表中所有值小于第一个元素 的结点均放在第一个结点之前 ,所有值大于 第一个元素的结点均放在第一个元素结点之后

已知带头结点单链表L,设计算法实现:以表中第一个元素作为标准,将表中所有值小于第一个元素 的结点均放在第一个结点之前 ,所有值大于 第一个元素的结点均放在第一个元素结点之后。(可参照耿教授的教材第73页,例2.8的算法)

要求完成以下要点:

1、描述单链表的存储结构定义;

2、创建单链表的算法;

3、完成本题目要求的算法;

4、测试本题正确执行的测试主函数main();

5、设计测试用例(输入的测试数据);

6、测试结果(可将输出结果截图)

#include

#include

#include

/* 节点结构定义 */

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

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;

}


你可能感兴趣的:(已知带头结点单链表L,设计算法实现:以表中第一个元素作为标准,将表中所有值小于第一个元素 的结点均放在第一个结点之前 ,所有值大于 第一个元素的结点均放在第一个元素结点之后)