(C语言、数据结构)双向链表---双向链表的初始化、尾插法的建立、插入、删除、遍历等相关操作的实现
程序员文章站
2022-03-22 19:52:27
...
(C语言、数据结构)双向链表
文章目录
前言
双向链表的初始化、尾插法的建立、插入、删除、遍历等相关操作的实现
一、双向链表是什么?
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
二、代码实现
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
typedef struct DList{
int data;
struct DList *prior,*next;
}DList,*LinkList;
bool InitList(LinkList &L){//初始化
L=(LinkList)malloc(sizeof(DList));
L->next=NULL;
L->prior=NULL;
}
LinkList BuildList(LinkList &L){//建立
DList *r,*p=L;
int x;
printf("建立双链表(输入9999结束) 请输入:");
scanf("%d",&x);
while(x!=9999){
r=(DList*)malloc(sizeof(DList));
if(r==NULL)
return false;
r->data=x;
r->next=NULL;
p->next=r;
p=r;
printf("再次输入:");
scanf("%d",&x);
}
return L;//非常重要
}
bool InsertList(LinkList &L,DList *p,int e){//插入 节点p后插入值为e的节点
DList *s=(LinkList)malloc(sizeof(DList));
if(s!=NULL)
if(p->next!=NULL)
{
s->data=e;
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
}
else{
s->data=e;
s->next=NULL;
s->prior=p;
p->next=s;
}
}
bool DeleteList(LinkList &L,DList *p){//删除节点p
if(p!=NULL)
if(p->next!=NULL)
{
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
}
else
{
p->prior->next=NULL;
free(p);
}
}
bool Ergodic(LinkList L){//遍历
if(L==NULL)
return false;
while(L->next!=NULL){
L=L->next;
printf("%d\n",L->data);
}
}
int main(){
LinkList L;
InitList(L);
L=BuildList(L);
int x=110;
InsertList(L,L->next->next->next,x);
DeleteList(L,L->next->next->next->next->next);
Ergodic(L);
}