【循环链表】
(有头结点)
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);