对于双向链表的实现和单链表非常相近,只是多了一个指向,本文仅实现带头结点的双向链表的插入、删除、打印,其他功能与单链表实现完全一致,若对单链表不熟悉请看:数据结构之单链表的实现
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);
}