main2-3-2.c 单循环链表

 /* main2-4.c 单循环链表,检验bo2-4.c的主程序 */
 #include"c1.h"
 typedef int ElemType;
 #include"c2-2.h"
 #include"bo2-4.c"
 #include"func2-3.c" /* 包括equal()、comp()、print()、print2()和print1()函数 */

 int main()
 {
   LinkList L;
   ElemType e;
   int j;
   Status i;
   InitList(&L); /* 初始化单循环链表L */
   i=ListEmpty(L);
   printf("L是否空 i=%d(1:空 0:否)\n",i);
   ListInsert(&L,1,3); /* 在L中依次插入3,5 */
   ListInsert(&L,2,5);
   i=GetElem(L,1,&e);
   j=ListLength(L);
   printf("L中数据元素个数=%d,第1个元素的值为%d。\n",j,e);
   printf("L中的数据元素依次为:");
   ListTraverse(L,print);
   PriorElem(L,5,&e); /* 求元素5的前驱 */
   printf("5前面的元素的值为%d。\n",e);
   NextElem(L,3,&e); /* 求元素3的后继 */
   printf("3后面的元素的值为%d。\n",e);
   printf("L是否空 %d(1:空 0:否)\n",ListEmpty(L));
   j=LocateElem(L,5,equal);
   if(j)
     printf("L的第%d个元素为5。\n",j);
   else
     printf("不存在值为5的元素\n");
   i=ListDelete(&L,2,&e);
   printf("删除L的第2个元素:\n");
   if(i)
   {
     printf("删除的元素值为%d,现在L中的数据元素依次为:",e);
     ListTraverse(L,print);
   }
   else
     printf("删除不成功!\n");
   ClearList(&L);
   printf("清空L后,L是否空:%d(1:空 0:否)\n",ListEmpty(L));
   DestroyList(&L);
 }

要在 PTA 平台上实现合并两个递增有序的单循环链表,可以参考以下思路和代码实现。合并两个递增有序的单循环链表,关键在于遍历两个链表,比较节点数据大小,将较小节点依次连接到新链表中,最后处理剩余节点并确保链表为循环链表。 以下是实现该功能的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; // 读取链表,细节表 List Read(); // 打印链表,细节表 void Print( List L ); // 合并两个递增有序的单循环链表 List Merge( List L1, List L2 ) { if (L1->Next == L1) return L2; if (L2->Next == L2) return L1; List p1 = L1->Next; List p2 = L2->Next; List L3 = (List)malloc(sizeof(struct Node)); List p3 = L3; // 断开原链表的循环 L1->Next = NULL; L2->Next = NULL; while (p1 && p2) { if (p1->Data <= p2->Data) { p3->Next = p1; p1 = p1->Next; } else { p3->Next = p2; p2 = p2->Next; } p3 = p3->Next; } // 处理剩余节点 if (p1) p3->Next = p1; if (p2) p3->Next = p2; // 找到新链表的尾节点 List tail = p3; while (tail->Next) tail = tail->Next; // 使新链表成为循环链表 tail->Next = L3; L3->Next = p3->Next; // 原链表置为空循环链表 L1->Next = L1; L2->Next = L2; return L3; } int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } ``` 在这段代码中,`Merge` 函数接收两个带头节点的递增有序单循环链表 `L1` 和 `L2`,返回合并后的带头节点的单循环链表。首先处理链表为空的情况,然后断开原链表的循环,比较两个链表节点数据大小,将较小节点连接到新链表 `L3` 中,处理剩余节点,找到新链表尾节点,使新链表成为循环链表,最后将原链表置为空循环链表
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值