您的位置:首页 > 其它

10.10将A和B合并成一个按元素递减链表

2017-11-24 23:44 127 查看
//10.10 对两个元素递增有序的单链表A和B,
//编写算法将A和B合并成一个按元素递减有序(允许有相同值)的单链表C,
//要求算法使用A,B中的原有节点,不允许增加新节点。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char data;                     //data为节点的数据信息
struct node *next;             //next为指向后继节点的指针
}LNode;                            //单链表节点类型
LNode *CreateLinkList()            //生成单链表
{
LNode *head, *p, *q;
int i, n;
head = (LNode *)malloc(sizeof(LNode));    //生成头节点
head->next = NULL;
p = head;
q = p;                                    //指针q始终指向链尾节点
printf("Input length of list:\n");
scanf("%d", &n);                          //读入节点数据
getchar();
printf("Input data of list:\n");
for (i = 1; i <= n; i++)                  //生成链表的数据节点
{
p = (LNode *)malloc(sizeof(LNode));   //申请一个节点空间
scanf("%c", &p->data);
getchar();
p->next = NULL;
q->next = p;                          //在链尾插入,把新节点p接在q后面,此时p是最后一个节点
q = p;                                //让q成为最后的节点(对于下一个数据而言)
}
return head;                              //返回指向单链表的头指针head
}

void Merge(LNode *A, LNode *B, LNode **C)
{
//将升序链表A,B合并成降序链表*C
LNode *p, *q, *s;
p = A->next;                              //p始终指向链表A的第一个未比较的数据节点
q = B->next;                              //q始终指向链表B的第一个未比较的数据节点
*C = A;                                   //生成链表*C的头节点
(*C)->next = NULL;
free(B);                                  //回收链表B的头节点空间
while (p != NULL && q != NULL)            //将A,B两链表中当前比较节点中值小者赋值给*s
{
if (p->data < q->data)
{
s = p;
p = p->next;
}
else
{
s = q;
q = q->next;
}
s->next = (*C)->next;                 //用头插法将结点*s插到链表*C的头结点之后
(*C)->next = s;
}
if (p == NULL)                            //如果指向链表A的指针*p为空,则使*p指向链表B
{
p = q;
}
while (p != NULL)                         //将*p所指链表中的剩余结点依次摘下插入的链表C的链首
{
s = p;
p = p->next;
s->next = (*C)->next;
(*C)->next = s;
}
}

void print(LNode *p)                          //输出单链表
{
p = p->next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}

int main()
{
LNode *A, *B, *C;
printf("Input data of list A:\n");
A = CreateLinkList();                     //生成单链表A
printf("Output list A:\n");
print(A);								  //输出单链表A

printf("Input daat of list B:\n");
B = CreateLinkList();                    //生成单链表B
printf("Output list B:\n");
print(B);                                //输出单链表B

printf("Make list C:\n");
Merge(A, B, &C);                         //将升序链表A, B合并成降序链表C
printf("Output list C:\n");
print(C);                                //输出单链表C

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单链表
相关文章推荐