现在的位置: 首页 > 综合 > 正文

双向链表

2013年12月11日 ⁄ 综合 ⁄ 共 2331字 ⁄ 字号 评论关闭

一:查看代码 cyq@cyq-desktop:~/桌面/C$ vim xlink.c

#include <stdlib.h>
#include <stdio.h>
typedef struct stda
{
int num  ;
stda*  next;
stda*  precur;
}STDA;
//用头节点输出
int showlink(STDA * head)
{
STDA *next = head;
while (NULL != next)
{
printf("%d/n",next->num);
next = next->next;
}
printf("show end!/n");
return 0;
}
//用尾节点输出
int showlink1(STDA * prec)
{
STDA *precur = prec;
while(precur!=NULL)
{
printf("%d/n",precur->num);
precur=precur->precur;
}
printf("show end!/n");
return 0;
}
//创建双向连表,头节点没变。
int createlink(STDA * head)
{
int i = 1;
STDA * next = NULL;
STDA * prev = head;
STDA * precur = head;
if(NULL == head)
{
return 1;
}
head->num = 0;
head->next = NULL;
head->precur= NULL ;
for(;i<10;i++)
{
STDA *next =(STDA *)malloc(sizeof(STDA));
//这里也可以这样 
//next =(STDA *)malloc(sizeof(STDA));
if(NULL == next)
{
return 1;
}
next->num =i;
next->next= NULL;
prev->next = next;
next->precur= precur;
prev= next;
precur= next;
}
return 0;
}
//创建连表返回尾节点
STDA *  createlink1(STDA * head)
{
int i = 1;
STDA * next = NULL;
STDA * prev = head;
STDA * precur = head;
if(NULL == head)
{
printf("error/n") ;
}
head->num = 0;
head->next = NULL;
head->precur= NULL ;
for(;i<10;i++)
{
STDA *next =(STDA *)malloc(sizeof(STDA));
//这里也可以这样 
//next =(STDA *)malloc(sizeof(STDA));
if(NULL == next)
{
printf("error/n");
}
next->num =i;
next->next= NULL;
prev->next = next;
next->precur= precur;
prev= next;
precur= next;
}
return precur;
}
//连表在数据域为pos添加节点,使其值为num
int linkadd(STDA * head,int pos,int num)
{
int ret = 0;
STDA * prev = head;
STDA * next = head;
STDA * data = NULL;
while(prev->num!=pos&&prev->next !=NULL)
{
prev= prev->next;
next= prev->next;
}
if(prev->num==pos)
{
data =(STDA *)malloc(sizeof(STDA));
if(NULL==data)
{
return 1;
}
data->num=num;
prev->next=data;
data->next=next;
data->precur=next->precur;
next->precur=data;
}
return 0;
}
//链表删除数据域为pos的节点
int linkdel(STDA * head, int pos)
{
int ret =0;
STDA * prev= head;
STDA * next=head;
STDA * data=NULL;
while(next->num!=pos&&next->next!=NULL)
{
prev=next;
next=next->next;
}
if(next->num==pos)
{
data=next;
next=next->next;
prev->next=next;
next->precur=prev;
free(data);
}
return 0;
}
int main(int argc ,char *argv[])
{
STDA * head= (STDA *)malloc(sizeof(STDA));
STDA * p=createlink1(head);
showlink1(p);//这样输出从尾节点到头节点
linkadd(head,4,100);//在数据域为4的节点后插入节点,使节点数据值大小为100
showlink1(p);//这样输出从头节点到尾节点
linkdel(head,100);//删除值(数据域)为100的节点
showlink(head);
return 0;
}
二:编译  并运行
cyq@cyq-desktop:~/桌面/C$ g++ xlink.c -o xlink && ./xlink
9
8
7
6
5
4
3
2
1
0
show end!
9
8
7
6
5
100
4
3
2
1
0
show end!
0
1
2
3
4
5
6
7
8
9
show end!
三:分析
这个链表的操作,包括创建、添加、删除,没有给出倒置。因为是双向链表没必要倒置。

分析代码的时候,只要注意指针的只指向就可以了。

 

 

声明:本文档可以随意更改,但必须署名原作者

                    

作者:凤凰舞者 qq:578989855

抱歉!评论已关闭.