C语言线性表归并,C语言 将两个已排序(从小到大)的线性表归并为一个线性表,并且归并后的线性表仍然按照从小到大的顺序...

满意答案

以下代码创建了一个奇数线性表和一个偶数线性表,奇数表有10个节点,偶数表有5个节点。

先看运行结果

b5ba24bf194b0599e30754174a28f366.png

以下是代码#include 

#include 

typedef struct List {

int number;

struct List*next;

} LinearList;

LinearList*createList(int);

LinearList*createList2(int);

void freeList(LinearList*);

LinearList* merger(LinearList*,LinearList*);

void printList(LinearList*);

main() {

LinearList*list1Head=createList(10);

printf("线性表一:\n");

printList(list1Head);

printf("\n");

LinearList*list2Head=createList2(5);

printf("线性表二:\n");

printList(list2Head);

printf("\n");

LinearList*head=merger(list1Head,list2Head);

printf("归并后的线性表:\n");

printList(head);

freeList(list1Head);

freeList(list2Head);

}

LinearList* merger(LinearList*list1Head,LinearList*list2Head) { //将list2分解插入list1

LinearList*node1=list1Head->next,*node2=list2Head->next;

LinearList*preNode1=list1Head,*preNode2=list2Head;

while(node1!=NULL&&node2!=NULL) {

if(node1->number>=node2->number) { //node2放在node1前面

//先从list2中删除node2

preNode2->next=node2->next;

//下面两行把node2插入list1

preNode1->next=node2;

node2->next=node1;

//移动指针

preNode1=node1;

node1=node1->next;

node2=preNode2->next;

} else { //node2放在node1后面

//先从list2中删除node2

preNode2->next=node2->next;

//下面两行把node2插入list1

node2->next=node1->next;

node1->next=node2;

//移动指针

preNode1=node2;

node1=node2->next;

node2=preNode2->next;

}

}

return list1Head;

}

LinearList*createList(int n) {

LinearList*head=NULL,*end=NULL,*node=NULL;

end=head=(LinearList*)malloc(sizeof(LinearList));

int i;

for(i=1; i<=n; i++) {

node=(LinearList*)malloc(sizeof(LinearList));

node->number=i*2-1;//奇数

end->next=node;

end=node;

}

end->next=NULL;

return head;

}

LinearList*createList2(int n) {

LinearList*head=NULL,*end=NULL,*node=NULL;

end=head=(LinearList*)malloc(sizeof(LinearList));

int i;

for(i=1; i<=n; i++) {

node=(LinearList*)malloc(sizeof(LinearList));

node->number=i*2;//偶数

end->next=node;

end=node;

}

end->next=NULL;

return head;

}

void freeList(LinearList*head) {

LinearList*node=head;

while(head!=NULL) {

head=head->next;

free(node);

node=head;

}

}

void printList(LinearList*head) {

LinearList*node=head->next;

while(node!=NULL) {

printf("%d ",node->number);

node=node->next;

}

printf("\n");

}

00分享举报

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值