题目:设带头结点的线性单链表A = (a1,a2,……,am),B = (b1,b2,……,bn)。试编写算法按下列规则合并A、B为线性单链表C,使得 C = (a1,b1,……,am,bm+1,……,bn), m <= n 或者 C = (b1,a1,……,bn,an,an+1,……,am), m > n
源代码
#include<stdio.h>#include<stdlib.h>typedefstructnode{int data;//数据structnode*next;}LNode,*LinkList;//单链表结构体
LinkList Listsreach(LinkList L,int i)//找到第i个结点{
LNode *p = L;int j =0;while(p -> next !=NULL&& j < i){
p = p -> next;
j ++;}//PrintList(L);if(j == i)return p;elsereturnNULL;}
LinkList CreatList()//创建链表{
LinkList H =(LinkList)malloc(sizeof(LNode));
H -> next =NULL;
LNode *s,*r = H;int x;printf("请输入第一个数据:");scanf("%d",&x);while(x !=-1){
s =(LinkList)malloc(sizeof(LNode));
s -> data = x;
r -> next = s;
r = s;printf("请输入下一个数据,若需要结束输入,则输入-1:");scanf("%d",&x);}
r -> next =NULL;return H;}voidPrintList(LinkList L)//打印链表{
L = L -> next;while(L !=NULL){printf("%d ",L -> data);
L = L -> next;}}intCount(LinkList L)//链表数据计数{int count =0;
L = L -> next;while(L !=NULL){
count ++;
L = L -> next;}return count;}
LinkList Addlist(LinkList A,LinkList B)//合并链表{
LinkList C,qa,qb;int m,n,i;
LNode *p = B -> next,*s = A -> next,*a,*b;
m =Count(A);
n =Count(B);if(m <= n){
C = A;
b =Listsreach(B,m +1);for(i =1;i <= m;i++){
qb = p;
qa = s;
p = p -> next;
s = s -> next;
qb -> next = qa -> next;
qa -> next = qb;}
qb -> next = b;
b -> data = b -> data +1;}elseif(m > n){
C = B;
a =Listsreach(A,n +1);for(i =1;i <= n;i++){
qb = p;
qa = s;
s = s -> next;
p = p -> next;
qa -> next = qb -> next;
qb -> next = qa;}
qa -> next = a;
a -> data = a -> data +1;}return C;}voidmain(){
LinkList A;
LinkList B;
LinkList C;int m,n;printf("请输入单链表La的数据");
A =CreatList();printf("请输入单链表Lb的数据");
B =CreatList();
C =Addlist(A,B);PrintList(C);}