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

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

双向链表比单链表有更好的灵活性,其大部分操作与线性表相同。下面总结双向链表与单链表之间的不同之处及我在实现过程中所遇到的问题。

1.双向链表的建立

双向链表在初始化时,要给首尾两个节点分配内存空间。成功分配后,要将首节点的prior指针和尾节点的next指针指向NULL,这是十分关键的一步,因为这是之后用来判断空表的条件。同时,当链表为空时,要将首节点的next指向尾节点,尾节点的prior指向首节点。

2.双向链表的插入操作

由于定义双向链表时指针域中多了一个prior指针,插入操作相应变得复杂,但基本操作也并不难理解。只需记住在处理前驱和后继指针与插入节点的关系时,应始终把握好“有序原则”,即若将插入节点与两个已存在的节点构成三角形,则应先处理“向上”的指针,再处理“向下”的指针。下面用代码描述其过程:

pinsert->prior=p;

pinsert->next=p->next;

p->next->prior=pinsert;

p->next=pinsert;

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);

}</

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构中,双向链表是一种常见的数据结构,和单向链表类似,只是在每个节点中多了一个指向前一个节点的prior指针。在C语言中,可以通过以下代码创建一个双向链表: ```c #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef int ElemType ; typedef struct Dnode{ ElemType data ; struct Dnode *prior ; struct Dnode *next ; }Dnode; Dnode *createDouble(int n) { Dnode *head , *p , *q ; int i ; head = (Dnode *)malloc(sizeof(Dnode)) ; head->prior = NULL ; head->next = NULL ; q = head ; for(i = 0 ; i < n ; i++) { p = (Dnode *)malloc(sizeof(Dnode)) ; scanf("%d", &p->data) ; q->next = p ; p->prior = q ; p->next = NULL ; q = p ; } q->next = NULL ; return head ; } void displayDouble(Dnode *L) { Dnode *p ; p = L->next ; while(p != NULL) { printf("%d\t", p->data) ; p = p->next ; } puts("") ; return ; } void main() { Dnode *L ; int num ; printf("Please input the num of elements\n") ; scanf("%d", &num) ; printf("Please input the elements to establish a double linked list\n") ; L = createDouble(num) ; displayDouble(L) ; return ; } ``` 这段代码首先定义了双向链表的节点结构体Dnode,其中包含了数据和指向前一个节点和后一个节点的指针。接着,通过createDouble()函数来创建一个双向链表,该函数参数n表示链表的节点个数,函数内部通过malloc()函数动态申请内存空间来创建节点,并使用scanf()函数来输入节点的数据。然后,我们可以通过displayDouble()函数来遍历并打印出链表中的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值