您的位置:首页 > 理论基础 > 数据结构算法

《数据结构》 循环链表和双向链表常用操作代码集合

2016-03-23 21:00 344 查看
Ps:每段代码中,添加了署名Solo的代码为博主本人所写,其余来自课本或者老师。

大量操作等同于单链表。重复的操作不再贴出,可以查看之前的博文。

循环链表

//结构体部分同单链表 略
//初始化循环链表
InitCLinkList(LinkList *CL)
{
*CL = (LinkList)malloc(sizeof(Node));    //建立循环链表的指针
(*CL)->next = *CL;    //建立空的循环链表
}
//尾插法建立循环单链表
void CreateCLinkList(LinkList CL)
/*CL是定义好的,已经初始化好的、带头结点的空循环链表的头指针
通过键盘输入元素值*/
{
Node *rear, *s;
char c;
rear = CL;    /*rear指针动态地指向链表的当前表尾,其初值指向头结点*/

while((c = getchar()) != '$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c;
rear->next = s;
s = rear;
}
rear->next = CL;    /*最后一个节点的nxt域指向头结点*/
}
//循环链表的合并算法(1)
LinkList merge_1(LinkList LA, LinkList LB)
{   /*此算法将采用头指针的循环单链表的首尾链接起来*/
Node *p,*q;
p =LA;
q = LB;

while(p->next != LA) p = p->next;
while(q->next != LB) q = q->next;
q->next = LA;   //修改表LB的尾指针,指向表LA的头结点
p->next = LB->next;    //修改LA的尾指针,指向LB的首元结点
free(LB);

return(LA);
}
//循环链表的合并算法(2)
LinkList merge_2(LinkList RA, LinkList RB)     //注意,RA、RB是尾指针
{   /*此算法将两个采用尾指针的循环单链表的首尾链接起来*/
Node *p;
p = RA->next;    /*保存链表RB的头结点地址*/
RA->next = RB->next->next;    /*链表RB的开始结点链到链表RA的终端结点之后*/
free(RB->next);    /*释放链表RB的头结点*/
RB->next = p;    /*链表RB的开始结点链到链表RA的终端结点之后*/

return RB;
}


双向链表

//双向链表的结构体定义如下
typedef struct DNode
{
ElemType data;
struct DNode *prior, *next;
} DNode, *DoubleList;
#define OK 1
#define ERROR 0
//双向链表的前插操作
int DlinkIns(DoubleList L, int i, ElemType e)
{
DNode *s, *p;
p = L; k = 0;

while(p && k<i)     //检查插入位置是否合法
{
p = p->next;
k++;
}
if(!p || k>i)    return ERROR;

s  = (DNode *)malloc(sizeof(DNode));
if(s)
{
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;      //四个步骤不能换位置,否则会产生指针丢失

return OK;
}
}
//双向链表的删除操作
int DLinkList(DoubleList L; int i; ElemType *e)
{
DNode *p;
p = L; k = 0;
while(p && k<i)     { p = p->next; k++}
if(!p || k>i)    return ERROR;

*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);

return OK;
}


zhihu:Solo | weibo@从流域到海域
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: