c语言:双向链表的实现

#include<iostream>
#include<stdio.h>
#include<math.h>
#define LEN sizeof(struct DNodelist)
using namespace std;
typedef struct DNodelist    //定义结构体
{
	int data;               //结点数据域
	struct DNodelist *prior;//结点前向指针
	struct DNodelist *next; //节点后向指针
}DNodelist;
//函数声明部分
void Error(char *s);                             // 错误处理函数
DNodelist *Creat_DNodelist(void);                 //创建双向链表函数
void Insert_DNodelist(DNodelist &l, int i, int e);  //向双链表中第i个结点插入元素e
void Delete_DNodelist(DNodelist &l, int i, int e);  //删除链表中第i个结点的元素,并用e返回
int  GetLength_DNodelist(DNodelist l);              //双向链表的长度
DNodelist *Find_DNodelist(DNodelist &l, int i);   //查找链表中第i个结点,并返回该结点的指针
void Modly_DNodelist(DNodelist &l, int e);        //查找双向链表中数据域为e的元素的结点,并将给位置输出
void Print_DNodelist(DNodelist &l);               //显示双向链表中的数据域中的元素
//函数编写部分
void Error(char *s)
{
	cout << s << endl;
	exit(1);
}
DNodelist *Creat_DNodelist(void)
{
	int i, length = 0, data = 0;
	DNodelist *Tail = NULL;
	DNodelist *pnew = NULL;
	DNodelist *head = (DNodelist *)malloc(LEN);
	if (NULL == head)
		Error("位置错误!");
	head->data = 0;
	head->prior = NULL;
	head->next = NULL;
	Tail = head;
	cout << "请输入想要创建链表的长度:";
	cin >> length;
	for (i = 1; i<length + 1; i++)
	{
		pnew = (DNodelist *)malloc(LEN);
		if (NULL == pnew)
			Error("位置错误!");
		cin >> data;
		pnew->data = data;
		pnew->next = NULL;
		pnew->prior = Tail;
		Tail->next = pnew;
		Tail = pnew;
	}
	return head;
}
int GetLength_DNodelist(DNodelist l)
{
	int length = 0;
	DNodelist *pt = l.next;
	while (pt != NULL)
	{
		length++;
		pt = pt->next;
	}
	return length;
}
DNodelist *Find_DNodelist(DNodelist &l, int i)
{
	DNodelist *prev = l.next;
	if (prev == NULL)
		Error("位置错误!");
	int j = 1;
	while ((prev->next != NULL) && (j < i))
	{
		prev = prev->next;
		j++;
	}
	return prev;
}
void Insert_DNodelist(DNodelist &l, int i, int e)
{
	DNodelist *prev = Find_DNodelist(l, i);
	DNodelist *ptr = (struct DNodelist *)malloc(LEN);
	ptr->data = e;
	prev->prior->next = ptr;
	ptr->prior = prev->prior;
	ptr->next = prev;
	prev->prior = ptr;
}

void Delete_DNodelist(DNodelist &l, int i, int e)
{
	DNodelist *prev = Find_DNodelist(l, i);
	e = prev->data;
	if (prev->next== NULL)
	{
	 DNodelist *pt = prev->prior;
	 pt->next = NULL;
	}
	else
	{
		prev->prior->next = prev->next;
		prev->next->prior = prev->prior;
	}
	cout << "删除的元素是:" << e << endl;;
	delete prev;
}

void Modly_DNodelist(DNodelist &l, int e)
{
	DNodelist *prev = l.next;
	if (prev == NULL)
		Error("位置错误!");
	int k = 1;
	while ((prev->next != NULL) && (prev->data != e))
	{
		prev = prev->next;
		k++;
	}
	cout << "元素e在链表中的位置是:" << k << endl;
}

void Print_DNodelist(DNodelist &l)
{
	DNodelist *prev = l.next;
	if (prev == NULL)
		Error("该链表为空表!");
	cout << "该链表数据是:" << endl;
	while (prev != NULL)
	{
		cout << prev->data << " ";
		prev = prev->next;
	}
	cout << endl;
}

int main()
{
	DNodelist *p = NULL;
	int m, n, t, q;
	int e = 0;
	p = Creat_DNodelist();
	cout << "该链表的长度是:" << GetLength_DNodelist(*p) << endl;;
	Print_DNodelist(*p);
	cout << "请输入你要插入的位置:";
	cin >> m;
	cout << "请输入你要插入的元素:";
	cin >> n;
	Insert_DNodelist(*p, m, n);
	cout << "插入后的链表数据是:";
	cout << "插入后的链表的长度是:" << GetLength_DNodelist(*p)<<endl;
	Print_DNodelist(*p);
	cout << "请输入你要删除的位置:";
	cin >> q;
	Delete_DNodelist(*p, q, e);
	cout << "删除后的链表的长度是:" << GetLength_DNodelist(*p) << endl;
	cout << "删除后的链表数据是:";
	Print_DNodelist(*p);
	cout << "请输入要查找的元素:";
	cin >> t;
	Modly_DNodelist(*p, t);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值