注意:
- 循环链表的基本操作与单链表的不同
- Link_L1L2函数中应该令p1->next = p2, 如果令p1->next = L2,结果会输出L2->data 错误如图所示:
#include<stdio.h>
#include<stdlib.h>
typedef struct DuLNode
{
int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
bool InitDuList(DuLinkList &L);
void CreateDuList_tail(DuLinkList &L, int n);
void print_DuList(DuLinkList L);
DuLinkList Link_L1L2(DuLinkList &L1, DuLinkList &L2);
int main()
{
DuLinkList L1, L2;
InitDuList(L1);
InitDuList(L2);
int m, n;
printf("输入L1中的元素个数:");
scanf("%d", &m);
CreateDuList_tail(L1, m);
printf("输入L2中的元素个数:");
scanf("%d", &n);
CreateDuList_tail(L2,n);
printf("输出链表L1:");
print_DuList(L1);
printf("\n");
printf("输出链表L2:");
print_DuList(L2);
printf("\n");
Link_L1L2(L1, L2);
printf("输出链接后的链表:");
print_DuList(L1);
return 0;
}
bool InitDuList(DuLinkList &L)
{
L = (DuLinkList)malloc(sizeof(DuLNode));
if(L == NULL)
{
printf("初始化失败!\n");
return false;
}
L->next = L;//这里不是=NULL
printf("初始化成功!\n");
}
void CreateDuList_tail(DuLinkList &L, int n)
{
DuLNode *p;
DuLNode *r = L;
printf("尾插法正序建立单链表 输入%d个元素:", n);
for(int i = 0; i < n; i ++)
{
p = (DuLinkList)malloc(sizeof(DuLNode));
scanf("%d", &p->data);
r->next = p;
r = p;
}
r->next = L;//此处不是=NULL
}
void print_DuList(DuLinkList L)
{
DuLNode *p;
p = L->next;
while(p != L)
{
printf("%d ", p->data);
p = p->next;
}
}
DuLinkList Link_L1L2(DuLinkList &L1, DuLinkList &L2)
{
DuLNode *p1 = L1->next;
DuLNode *p2 = L2->next;
while(p1->next != L1)
p1 = p1->next;
p1->next = p2;//注意此处如果令p1->next = L2的话,最后会输出L2->data
while(p2->next != L2)
p2 = p2->next;
p2->next = L1;
return L1;
}
运行结果如图所示: