0
点赞
收藏
分享

微信扫一扫

【无标题】数据结构C++:双向链表

小铺有酒一两不够 2022-01-25 阅读 57

双向链表基本操作:

#include <iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;

typedef struct DuLNode
{
	ElemType data;
	struct DuLNode* prior;
	struct DuLNode* next;
}DuLNode,*DuLinkList;

Status InitList(DuLinkList& L)//初始化双向链表
{
	L = new DuLNode;
	if (!L) exit(-1);
	L->prior = L;
	L->next = L;
	return 0;
}

 DuLinkList GetElem_DuL(DuLinkList L, int i)//按位置查找双向链表中的元素
{
	if (i < 1) return ERROR;
	DuLinkList p;
	p = new DuLNode;
	p = L->next;
	for (int j = 1; j < i; j++)
	{
		p = p->next;
	}
	return p;
}

Status ListInsert_DuL(DuLinkList& L, int i, ElemType e)//第i个元素前插入
{
	DuLinkList p;
	if (!(p = GetElem_DuL(L, i)))
	{
		return ERROR;
	}
	DuLinkList s;
	s = new DuLNode;
	s->data = e;
	s->prior = p->prior;
	p->prior->next = s;
	s->next = p;
	p->prior = s;
	return OK;
}

Status ListDelete_DuL(DuLinkList& L, int i)//删除第i个位置的元素
{
	DuLinkList p;
	if (!(p = GetElem_DuL(L, i)))
		return ERROR;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	delete p;
	return OK;
}

DuLinkList LocateElem_DuL(DuLinkList L, ElemType e)//按值查找,返回数据域为e的指针
{
	DuLinkList p;
	p = new DuLNode;
	for (p = L->next; p!= L; p = p->next)
	{
		if (p->data == e)
		{
			return p;
			break;
		}
	}

}

主函数测试:

#include <iostream>
#include "循环链表.hpp"
using namespace std;

void CreateList_R(DuLinkList& L, int n)//后插法创建双向链表
{
    InitList(L);
    DuLinkList r = L;
    cout << "请输入链表元素" << endl;
    for (int i = 0; i < n; ++i)
    {
        DuLinkList p = new DuLNode;
        cin >> p->data;
        p->next = L;
        p->prior = r;
        r->next = p;
        L->prior = p;
        r = p;
    }

}



void Traverse_DuL(DuLinkList L)//遍历双向链表
{
    DuLNode * p =L->next;
    cout << "链表元素为:" << endl;
    while(p!= L)
    {
        cout << p->data<<" ";
        p = p->next;
    }
}

int main()
{
    DuLinkList L,p,q;
    int n;
    cout << "输入元素的个数:" << endl;
    cin >> n;
    CreateList_R( L, n);//num=5,元素为1 2 3 4 5
    Traverse_DuL(L);
    cout << endl;

    int i,e;
    cout << "输入一个位置:" << endl;
    cin >> i;
    q = GetElem_DuL(L, i);
    cout << "该位置的元素为:" << endl;
    cout << q->data << endl;

    cout << "输入想查找元素的值:"<<endl;
    cin >> e;
    cout << "该元素的地址为:" << endl;
    cout<<LocateElem_DuL(L, e)<<endl;

    int j;
    cout << "输入一个位置:"<<endl;
    cin >> j;
    cout << "输入一个值:" << endl;
    cin >> e;
    ListInsert_DuL(L, j, e);
    Traverse_DuL(L);
    cout << endl;

    cout << "输入删除元素的位置:";
    cin >> i;
    ListDelete_DuL(L, i);
    Traverse_DuL(L);

    return 0;
}
举报

相关推荐

0 条评论