欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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