//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;
}
10.10将A和B合并成一个按元素递减链表
最新推荐文章于 2021-06-13 23:49:48 发布