数据结构之双向链表的实现

对于双向链表的实现和单链表非常相近,只是多了一个指向,本文仅实现带头结点的双向链表的插入、删除、打印,其他功能与单链表实现完全一致,若对单链表不熟悉请看:数据结构之单链表的实现
1.首先家里结构体:

typedef struct Noded{
	struct Noded *pre;//前驱
	struct Noded *next;//后驱
	int data;//数据域
	
}Noded;

2.接着实现对头结点的初始化

//初始化头结点 
void Init(Noded *head){
	head = malloc(sizeof(Noded));
	head->data = 0;
	head->pre = head;
	head->next = head;
}

3.实现尾部插入

void tailInsert(Noded *head,int data){
	Noded *cur;
	Noded *p = malloc(sizeof(Noded));
	if(!p)
	return;
	p->data = data;
	if(head == NULL){
		head->next = p;
		p->pre = head;
	}
	cur = head;
	while(cur->next!=NULL){
		cur = cur->next;
	}
	cur->next = p;
	p->pre = cur;
	p->next = NULL;
	size++;
}

4.实现普通位置的插入

//在下标为 k 的位置插入 
void Insert(Noded *head,int k, int x){
	if(k < -1 || k > size)
	return;
	Noded *p = malloc(sizeof(Noded));
	p->data = x;
	if(k == -1)
	{
		p->next = head->next;
		p->pre = head;
		if(p->next!=NULL)
		p->next->pre = p;
	}
	Noded *cur = head;
	int i;
	for(i = 0; i < k; i++){
		cur = cur->next;
	}
	p->next = cur->next;
	cur->next->pre = p;
	p->pre = cur;
	cur->next = p;
	if(p->next!=NULL)
	p->next->pre = p;
}

5.实现删除特定位置元素的操作:主要是找到第 k 个元素并把它 free掉,之后建立新的指向即可

//删除下标为 k 的元素 
void deleted(Noded *head, int k){
	if(head == NULL)
	return;
	int i;
	Noded *cur = head;
	for(i = 0; i < k; i++){
		cur = cur->next;
	}
	Noded *s = cur->next->next;
	free(cur->next);
	cur->next = s;
	if(s!=NULL)
	s->pre = cur;
}

6.最后实现对双向链表的打印:和打印单链表完全一致

void print(Noded *head){
	if(head == NULL)
	return;
	Noded *cur = head->next;
	while(cur != NULL)
	{
		printf("%d ",cur->data);
		cur = cur->next ;
	}
}

完整代码如下

#include <stdio.h>
#include <stdlib.h>

typedef struct Noded{
	struct Noded *pre;
	struct Noded *next;
	int data;
	
}Noded;
static int size;
//初始化头结点 
void Init(Noded *head){
	head = malloc(sizeof(Noded));
	head->data = 0;
	head->pre = head;
	head->next = head;
}

//在结尾插入 
void tailInsert(Noded *head,int data){
	Noded *cur;
	Noded *p = malloc(sizeof(Noded));
	if(!p)
	return;
	p->data = data;
	if(head == NULL){
		head->next = p;
		p->pre = head;
	}
	cur = head;
	while(cur->next!=NULL){
		cur = cur->next;
	}
	cur->next = p;
	p->pre = cur;
	p->next = NULL;
	size++;
}

void print(Noded *head){
	if(head == NULL)
	return;
	Noded *cur = head->next;
	while(cur != NULL)
	{
		printf("%d ",cur->data);
		cur = cur->next ;
	}
}

//删除下标为 k 的元素 
void deleted(Noded *head, int k){
	if(head == NULL)
	return;
	int i;
	Noded *cur = head;
	for(i = 0; i < k; i++){
		cur = cur->next;
	}
	Noded *s = cur->next->next;
	free(cur->next);
	cur->next = s;
	if(s!=NULL)
	s->pre = cur;
}

//在下标为 k 的位置插入 
void Insert(Noded *head,int k, int x){
	if(k < -1 || k > size)
	return;
	Noded *p = malloc(sizeof(Noded));
	p->data = x;
	if(k == -1)
	{
		p->next = head->next;
		p->pre = head;
		if(p->next!=NULL)
		p->next->pre = p;
	}
	Noded *cur = head;
	int i;
	for(i = 0; i < k; i++){
		cur = cur->next;
	}
	p->next = cur->next;
	cur->next->pre = p;
	p->pre = cur;
	cur->next = p;
	if(p->next!=NULL)
	p->next->pre = p;
}

int main(){
	Noded *head;
	Init(head);
	int i;
	for(i = 0; i < 7; i++)
	tailInsert(head,i);
	print(head);
	printf("\n");
	Insert(head,6,9);
	print(head);
	printf("\n%d\n",size);
	deleted(head,0);
	print(head);
}

猜你喜欢

转载自blog.csdn.net/qq_43060759/article/details/83025260