双向循环链表的存储结构:
双向链表也是采用的链式存储结构,它与循环链表的区别就是每个数据结点中多了一个指向前驱元素的指针域 ,可以有头结点,也可以没有。它的存储结构如下图:
当只有头结点时:
具体代码实现:
//双向循环链表,有头结点
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
using namespace std;
typedef int elemtype;
typedef struct DOUBLE_LIST
{
elemtype data;
struct DOUBLE_LIST *prev;
struct DOUBLE_LIST *next;
}double_list;
//创建双向循环链表
double_list *creatlist()
{
double_list *head, *p, *q;
int n;
elemtype x;
head = (double_list*)malloc(sizeof(double_list));//先创建头结点
head->next = head;
head->prev = head;
p = head;
printf("输入要创建双向循环链表元素的个数:\n");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("输入元素为:\n");
scanf("%d", &x);
q = (double_list*)malloc(sizeof(double_list));
q->data = x;
q->prev = p;
q->next = head;
p->next = q;
head->prev = q;
p = q;
}
return head;
}
//显示双向循环链表
void dispaly(double_list *head)
{
double_list *p;
p = head;
p = p->next;
while (p != head)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//获得双向链表中元素的个数
int length(double_list *head)
{
double_list *p;
p = head;
int num = 0;
while ((p->next) != head)
{
p = p->next;
num++;
}
return num;
}
//在第i个元素之前插入数据
void insertelem(double_list *head, int i, elemtype elem)
{
double_list *p = head;
double_list *q = (double_list*)malloc(sizeof(double_list));
q->data = elem;
for (int j = 1; j < i; j++)
{
p = p->next;
if (p == head && j < i)
{
printf("error \n");
}
}
q->next = p->next;
p->next->prev = q;
p->next = q;
q->prev = p;
}
//删除第i个元素的数据
void deletelem(double_list *head, int i, elemtype &elem)
{
double_list *p = head;
for (int j = 1; j < i; j++)
{
p = p->next;
if (p->next == head && j < i)
{
printf("error \n");
}
}
double_list *q = p->next;
elem = q->data;
(q->next)->prev = p;
p->next = q->next;
free(q);
}
//删除值为x的元素
void deletelist_x(double_list *head, int x)
{
double_list *p = head, *q;
p = p->next;
while (p != head)
if (p->data == x)
{
q = p->next;
(p->prev)->next = p->next;
(p->next)->prev = p->prev;
free(p);
p = q;
}
else
p = p->next;
}
int main()
{
double_list *head;
head = creatlist();//创建
dispaly(head);
int num;
int i, j, x;
elemtype elem;
num = length(head);
cout << "插入元素的位置:" << endl;
cin >> i;
cout << "插入的数据为:" << endl;
cin >> elem;
insertelem(head, i, elem);
dispaly(head);
cout << "删除元素的位置为:" << endl;
cin >> j;
deletelem(head, j, elem);
dispaly(head);
cout << "删除的数据为:" << endl;
cin >> x;
deletelist_x(head, x);
dispaly(head);
system("pause");
return 0;
}
运行结果如图: