【循环链表】
(有头结点)
p=R1->next;
R1->next=R2->next->next;
free(R2->next);
R2->next=p;
例:对于两个单循环链表a,b,将其连接起来,变成一个单循环链表
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int date;
struct LNode* next;
} LNode,*LinkList;
LinkList Great_LinkList()
{
LinkList L,R;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
R=L;
scanf("%d",&x);
while(x!=0)
{
R->next=(LinkList)malloc(sizeof(LNode));
R->next->date=x;
R=R->next;
scanf("%d",&x);
}
R->next=L;
return L;
}
void combine_LinkList(LinkList a,LinkList b)
{
LinkList p,p2;
LinkList R,R2;//分别为a,b的尾指针
p=a->next;;
p2=b->next;
while(p->next!=a)//找链表a的尾指针
{
p=p->next;
}
while(p2->next!=b)//找链表b的尾指针
{
p2=p2->next;
}
R=p;
R2=p2;
R->next=b->next;
R2->next=a;
free(b);
}
void printLink(LinkList L)
{
LinkList p;
if(L->next==NULL)
printf("表空!");
else
{
p=L->next;
while(p!=L)//结束循环的标志变为尾指针指向头指针
{
printf("%4d",p->date);
p=p->next;
}
printf("\n");
}
}
int main()
{
LinkList a,b;
printf("请输入链表1:");
a=Great_LinkList();
printf("请输入链表2:");
b=Great_LinkList();
printf("链表1:");
printLink(a);
printf("链表2:");
printLink(b);
combine_LinkList(a,b);
printf("合并后链表:");
printLink(a);
return 0;
}
注:与非循环链表相比,只是将原来判断指针是否为NULL,变成判断指针是否为头指针
【双向链表】
【定义】
typedef struct LNode
{
int date;
struct LNode *prior,*next;
} LNode,*LinkList;
*p为双向链表的一个结点,将*s插入到*p的后面
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
【双向链表的插入】
void insert_LinkList(LinkList L)//插入
{
LinkList p,s;
int i,x;
printf("请输入要插入的位置:");
scanf("%d",&i);
p=Get_LinkList(L,i-1);
printf("请输入要插入的数据:");
scanf("%d",&x);
if(p==NULL)
{
printf("参数i错误");
}
else
{
s=(LinkList)malloc(sizeof(LNode));
s->date=x;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
}
}
【双向链表的删除】
(1) p->prior->next=p->next;
(2)p->next->prior=p->prior;
free(p);