数据结构-双向链表的建立及使用

#include<iostream>
#include<malloc.h>
#include<stdlib.h>
using namespace std;

typedef int elemtype;

typedef struct Dlnode
{//建立双向链表的结点,结点中包含data、前指针、后指针
	elemtype data;//结点中存放的数据
	struct Dlnode *prior;//结点的前指针
	struct Dlnode *next;//结点的后指针
}Dlnode,*Linklist;//Dlnode是结构体类型,Linklist是结构体指针类型

Linklist Create()
{
	int e;//存放L中的数据data

	Linklist L,p,q;//L是链表的头结点,p是连在L后面的新建结点,q是尾指针
	L=(Linklist)malloc(sizeof(Dlnode));
	L->next=NULL;
	L->prior=NULL;//初始化头结点

	q=L;//q指向头结点

	cout<<"请输入链表的各个结点元素的数值:";
	cin>>e;
	while(e!=9999)//判断e是否是9999,若不是继续输入,若是停止输入
	{
		p=(Linklist)malloc(sizeof(Dlnode));
		p->next=NULL;
		p->prior=NULL;//给新建结点分配内存空间并初始化

		p->data=e;
		cin>>e;

		q->next=p;//q指向的结点的next指针指向p
		p->prior=q;//p结点的前驱指针指向q结点
		q=q->next;//将p连到链表后,q指向下一个结点
	}

		return L;//函数返回L链表
}

void Print(Linklist L)
{
	Linklist q;//指针,用于指向链表中的某个结点
	q=L->next;//q指向链表的第一个结点

	while(q!=NULL)
	{
		cout<<q->data<<' ';//输出结点数据
		q=q->next;//q指向下一个结点
	}

	cout<<endl;
}

Linklist Delete(Linklist L,int i)
{//删除第i个结点
	Linklist q;//新建一个指针
	q=L;//指针指向头结点

	int j=0;//j用于计数

	while((j<i)&&(q!=NULL))//j小于i并且q指针指向的结点不是空
	{
		q=q->next;//q指向下一个结点
		j++;//计数器加一
	}

	q->prior->next=q->next;//q的前一个结点指向q的后一个结点
	q->next->prior=q->prior;//q的后一个结点指向q的前一个结点

	delete q;//释放q结点的内存

	return L;//函数返回L
}

Linklist Insert(Linklist L,int i,int x)//在链表的第i个元素前插入x
{
	Linklist q;//新建一个指针
	q=L;//指针指向头结点

	int j=0;//j用于计数

	while((j<i)&&(q!=NULL))//j小于i并且q指针指向的结点不是空
	{
		q=q->next;//q指向下一个结点
		j++;//计数器加一
	}//最终q指向第i个结点

	Linklist p;//新建一个结点
	p=(Linklist)malloc(sizeof(Dlnode));//给结点分配内存空间
	p->next=NULL;//p的后指针指向空
	p->prior=NULL;//p的前指针指向空
	p->data=x;//p的数据域存放的是x

	p->next=q;//p的后指针指向q
	q->prior->next=p;//第i-1个元素的后指针指向p
	p->prior=q->prior;//p的前指针指向第i-1个元素
	q->prior=p;//q的前指针指向p
    

	return L;//函数返回链表L
}

void main()
{
	Linklist L;

	char choise;
	cout<<"请输入双向链表的各个数值:(若输入9999则结束)"<<endl;
	L=Create();
	Print(L);
	cout<<"字母A表示删除第i个结点"<<endl;
	cout<<"字母B表示在第i个元素前插入一个新的结点,结点元素值为e"<<endl;
	cout<<"请输入字母:";
	cin>>choise;
	cout<<endl;
	switch(choise)
	{
		case'A':
			{
				int i;
				cout<<"请输入i:"<<' ';
				cin>>i;
				L=Delete(L,i);
				Print(L);
				break;
			}
		case'B':
			{
				int z,e;
				cout<<"请输入i和e:"<<' ';
				cin>>z>>e;
				L=Insert(L,z,e);
				Print(L);
				break;
			}
	}

	system("pause");
}

猜你喜欢

转载自blog.csdn.net/qq_41596915/article/details/82917042