c语言建立双向链表prior,next,C语言数据结构双向链表的建立与基本操作

更新时间:2023-06-30 15:30:01 阅读: 评论:0

c语⾔建⽴双向链表prior,next,C语⾔数据结构双向链表的建⽴
与基本操作
C语⾔数据结构 双向链表的建⽴与基本操作
双向链表⽐单链表有更好的灵活性,其⼤部分操作与线性表相同。下⾯总结双向链表与单链表之间的不同之处及我在实现过程中所遇到的问题。
1.双向链表的建⽴
双向链表在初始化时,要给⾸尾两个节点分配内存空间。成功分配后,要将⾸节点的prior指针和尾节点的next指针指向NULL,这是⼗分关键的⼀步,因为这是之后⽤来判断空表的条件。同时,当链表为空时,要将⾸节点的next指向尾节点,尾节点的prior指向⾸节点。
2.双向链表的插⼊操作装修委托书怎么写
由于定义双向链表时指针域中多了⼀个prior指针,插⼊操作相应变得复杂,但基本操作也并不难理解。只需记住在处理前驱和后继指针与插⼊节点的关系时,应始终把握好“有序原则”,即若将插⼊节点与两个已存在的节点构成三⾓形,则应先处理“向上”的指针,再处
理“向下”的指针。下⾯⽤代码描述其过程:
pinrt->prior=p;
茶鸡蛋的做法pinrt->next=p->next;
p->next->prior=pinrt;
p->next=pinrt;
3.双向链表的删除操作
理解了双向链表的插⼊操作后,删除操作便⼗分容易理解。下⾯⽤代码描述其过程:
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
双向链表的其他操作与单链表类似,在此不再赘述,完整的代码如下:
#include
陶行知的四块糖果#include
#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int status;
typedef int elemtype;
typedef struct node{
elemtype data;
struct node * next;
struct node * prior;
}node;
电子金融
typedef struct node* dlinklist;
status visit(elemtype c){
printf("%d ",c);
}
/*双向链表初始化*/
status initdlinklist(dlinklist * head,dlinklist * tail){
(*head)=(dlinklist)malloc(sizeof(node));
(*tail)=(dlinklist)malloc(sizeof(node));
if(!(*head)||!(*tail))
return ERROR;
/*这⼀步很关键*/
(*head)->prior=NULL;
(*tail)->next=NULL;
/*链表为空时让头指向尾*/
(*head)->next=(*tail);
(*tail)->prior=(*head);
}三角形边长计算
/*判定是否为空*/
status emptylinklist(dlinklist head,dlinklist tail){
if(head->next==tail)
return TRUE;
el
return FALSE;
}
/*尾插法创建链表*/
status createdlinklisttail(dlinklist head,dlinklist tail,elemtype data){ dlinklist pmove=tail,pinrt;
pinrt=(dlinklist)malloc(sizeof(node));
if(!pinrt)
return ERROR;
pinrt->data=data;
pinrt->next=NULL;
pinrt->prior=NULL;
tail->prior->next=pinrt;
pinrt->prior=tail->prior;
pinrt->next=tail;
tail->prior=pinrt;
}
/*头插法创建链表*/
status createdlinklisthead(dlinklist head,dlinklist tail,elemtype data){ dlinklist pmove=head,qmove=tail,pinrt;
pinrt=(dlinklist)malloc(sizeof(node));
if(!pinrt)
return ERROR;
el{
pinrt->data=data;
pinrt->prior=pmove;
pinrt->next=pmove->next;
pmove->next->prior=pinrt;
pmove->next=pinrt;
}
}
/*正序打印链表*/
status traverlist(dlinklist head,dlinklist tail){
/孙子谋略
*dlinklist pmove=head->next;
while(pmove!=tail){
printf("%d ",pmove->data);
pmove=pmove->next;
}
printf("\n");
return OK;*/
dlinklist pmove=head->next;
while(pmove!=tail){
visit(pmove->data);
pmove=pmove->next;
}
printf("\n");
}
/*返回第⼀个值为data的元素的位序*/
status locateelem(dlinklist head,dlinklist tail,elemtype data){
dlinklist pmove=head->next;
int pos=1;
while(pmove&&pmove->data!=data){
pmove=pmove->next;
pos++;
}
装卸桥
return pos;
}
/*返回表长*/
status listlength(dlinklist head,dlinklist tail){
dlinklist pmove=head->next;
int length=0;
while(pmove!=tail){
pmove=pmove->next;
length++;
}
return length;
}
/*逆序打印链表*/
status inver(dlinklist head,dlinklist tail){
dlinklist pmove=tail->prior;
while(pmove!=head){
visit(pmove->data);
pmove=pmove->prior;
}
printf("\n");
}
/*删除链表中第pos个位置的元素,并⽤data返回*/
status deleteelem(dlinklist head,dlinklist tail,int pos,elemtype *data){ int i=1;
dlinklist pmove=head->next;
while(pmove&&i
pmove=pmove->next;
i++;
}
if(!pmove||i>pos){
printf("输⼊数据⾮法\n");
return ERROR;
}
el{
*data=pmove->data;
pmove->next->prior=pmove->prior;
pmove->prior->next=pmove->next;
free(pmove);
}
}
/*在链表尾插⼊元素*/
status inrttail(dlinklist head,dlinklist tail,elemtype data){ dlinklist pinrt;
pinrt=(dlinklist)malloc(sizeof(node));
pinrt->data=data;
pinrt->next=NULL;
pinrt->prior=NULL;
tail->prior->next=pinrt;
pinrt->prior=tail->prior;
pinrt->next=tail;
tail->prior=pinrt;
return OK;
}
int main(void){
dlinklist head,tail;
int i=0;
elemtype data=0;
initdlinklist(&head,&tail);
if(emptylinklist(head,tail))

本文发布于:2023-06-30 15:30:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1070436.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:链表   双向   节点   操作   指针   过程   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图