#include"iostream"
#include"stdlib.h"
using namespace std;
/*
此代码为双链表的基本操作具体实现
*/
typedef struct DNode {
int data; //数据域
struct DNode *prior; //指向前驱结点的指针
struct DNode *next; //指向后继结点的指针
}DNode,*DLinklist;
//1.双链表的初始化
bool Init(DLinklist &L) {
DNode* p = (DNode*)malloc(sizeof(DNode)); //创建头结点
if (p == NULL)
return false;
p->prior = NULL; //前驱为NULL
p->next = NULL; //后继为NULL
L = p;
return true;
}
//2.头插法建立双链表
DLinklist insert_head(DLinklist& L,int e) { //元素e 为结点的数据
DNode *p = (DNode*)malloc(sizeof(DNode));
if (p == NULL)
return NULL;
p->data = e;
if (L->next == NULL) //第一个结点的建立要特殊处理
{
L->next = p;
p->prior = L;
p->next = NULL;
return L;
}else{
p->next = L->next;
L->next->prior = p;
p->prior = L;
L->next = p;
}
return L;
}
//3.查找结点
DNode* GetElem(DLinklist L, int i) {
if (i < 1) return NULL;
DNode *p = L->next;
int j = 1;
if (p == NULL)
return NULL;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
//4.插入结点(后插)
bool Insert(DLinklist &L,int i,int e) { //在位置i插入元素e
if (i < 1) //顺序表从1开始,位序小于1的结点非法
return false;
DNode *p = GetElem(L, i); //查找第i个结点
if (p == NULL) //非法位序
return false;
DNode *New = (DNode*)malloc(sizeof(DNode)); //New为待插入结点
New->data = e;
if (p->next == NULL) { //最后一个结点的插入要特殊处理
New->prior = p;
p->next = New;
New->next = NULL;
return true;
}
New->next = p->next;
p->next->prior = New;
New->prior = p;
p->next = New;
return true;
}
//5.删除结点
bool Delete(DLinklist &L,int i) {
if (i < 1) //顺序表从1开始,位序小于1的结点非法
return false;
DNode *p = GetElem(L, i); //查找第i个结点
if (p == NULL) //待删除的结点不存在
return false;
DNode* p_prior=p->prior; //找到p的前驱
DNode* p_next=p->next; //找到p的后继
if (p_next != NULL) //删除结点不为尾结点时
{
p_next->prior = p_prior;
}
p_prior->next = p_next;
free(p);
return true;
}
//6.销毁双链表 (从表头开始依次销毁结点)
bool DestoryDinkList(DLinklist &L) {
DNode *p = L->next; //p始终指向第一个结点
if (p == NULL) //本来就是空的 返回true
return true;
while (p->next!= NULL) {
p->next->prior = L;
L->next = p->next;
free(p);
p = L->next; //p始终指向第一个结点
}
free(p); //删除最后一个结点
L->next = NULL; //头结点的next指向NULL 表示清空完毕
return true;
}
//7.打印双链表
void Print_DLinklist(DLinklist L) {
int n = 0;
DNode *p = L->next; //p指向第一个结点
while (p != NULL) {
cout << p->data << " ";
n++;
p = p->next;
}
cout << endl;
cout << "当前链表长度:" << n<<endl;
}
int main(){
DLinklist L;
//1.初始化
Init(L);
Print_DLinklist(L);
//2.头插法建立单链表
for (int i = 1; i <= 10; i++)
insert_head(L, i);
Print_DLinklist(L);
//3.查找结点
DNode* res=GetElem(L, 110);
if (res != NULL)
cout << "查找结果为:" << res->data << endl;
else
cout << "查找结果为:NULL" << endl;
//4.插入结点(后插)
Insert(L, 10, 999);
Print_DLinklist(L);
//5.删除结点
Delete(L, 11);
Print_DLinklist(L);
//6.销毁双链表
DestoryDinkList(L);
Print_DLinklist(L);
system("pause");
return 0;
}
带头结点双链表的基本操作的具体实现
最新推荐文章于 2024-06-18 17:54:08 发布