#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
using namespace std;
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior;//直接前驱指针
struct DuLNode *next;//直接后驱结点
}DuLNode,*DuLinkList;
//创建双链表
DuLinkList CreateDuLinkList(DuLinkList L, int n)
{
cin >> L->data;
L->next = NULL;
L->prior = NULL;
DuLinkList p, r;
int i;
r = L;//r为指向尾部的结点
for (i = 1; i < n; i++)
{
p = (DuLNode*)malloc(sizeof(DuLNode)); //生成新结点
cin>> p->data;
r->next = p; //将表尾终端结点的指针指向新结点
p->prior = r;
r = p; //将当前的新结点定义为表尾终点
}
r->next = NULL;//表示当前链表结束
L->prior = NULL;
return L;
}
//双链表的删除,删除的元素放到e中
Status DeleteList(DuLinkList L, int i,ElemType &e)
{
int j;
DuLinkList p, q;
p = L;
j = 1;
while ( p->next && j < i)//遍历寻找第i个元素
{
p = p->next;
j++;
}
if (!(p->next)||j>i)
return ERROR;//第i个元素不存在
e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return OK;
}
//在第i个位置之前插入新元素e,L的长度加1
Status InsertDuList(DuLinkList L, int i, ElemType e)
{
DuLinkList p, s;
p = L;
int j = 1;
while (p&&j < i)
{
p = p->next;
j++;
}
if (!p || j>i)
return ERROR;
s = (DuLNode *)malloc(sizeof(DuLNode));
s->data = e;
//顺序不要乱
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
void PrintDuLinkList(DuLinkList L,int n)
{
while (L!= NULL)
{
cout << L->data << " ";
L = L->next;
}
cout << endl;
}
void main()
{
const int n = 5;
DuLinkList L = (DuLinkList)malloc(sizeof(DuLNode)); //声明一个双链表
cout << "请输入" << n << "个数据" << endl;
L = CreateDuLinkList(L, n);
PrintDuLinkList(L, n);
测试删除结点
int i = 3;//删除第三个结点
ElemType e;
DeleteList(L, i, e);
PrintDuLinkList(L, n-1);
cout << endl << "删除的元素为:" << e << endl << endl;
//测试插入结点
i = 4;
e = 8;
InsertDuList(L, i, e);
PrintDuLinkList(L, n);
//cout << endl << "插入一个数据后的链表元素为:" << e << endl << endl;
system("pause");
}
双链表的创建、删除、插入及打印(数据结构)
最新推荐文章于 2022-11-15 22:42:24 发布