题目

设有一个带头结点的双向链表h,设计一个算法用于查找第一个元素之为x的结点,并将其与其前驱结点进行交换。
要求:
1、定义带头结点的双向链表的型DLIST。
2、定义双向链表DLIST的基本操作。
3、定义函数int swap(elementtype x, DLIST &h),查找第一个元素之为x的结点,如果在链表中存在元素值为x的结点,并其与其前驱结点进行交换,并返回1,否则返回0。
4、在主函数中测试所编写函数的正确性。

代码

#include <iostream>
using namespace std;

typedef int ElemType;

struct dcelltype {
   
	ElemType data;
	dcelltype* next, * prior;
};
typedef dcelltype* DLIST;
typedef dcelltype* position;

void Insert(ElemType x, position p, DLIST& L)
{
   
	position q = new dcelltype;
	q->data = x;
	q->next = p->next;
	p->next = q;
	q->prior = p;
	if (q->next != NULL)
		q->next->prior = q;
}

void Delete(position p, DLIST& L)
{
   
	if (p->prior != NULL)
		p->prior->next = p->next;
	if (p->next != NULL)
		p->next->prior = p->prior;
	delete p;
}

position Previous(position p, DLIST L)
{
   
	position q;
	if (p->prior == NULL)
	{
   
		cout << "不存在前驱位置";
		return NULL;
	}
	else
	{
   
		q = p->prior;
		return q;
	}
}

position MakeNull(DLIST& L)
{
   
	L = new dcelltype;
	L->next = NULL;
	return L;
}

// 后面与 LIST 相同
position Locate(ElemType x, DLIST L)
{
   
	position p = L;
	while (p->data != x && p->next != NULL)
	{
   
		p = p->next;
	}
	if (p->data != x)
	{
   
		return NULL;
	}
	return p;
}

ElemType Retrieve(position p, DLIST L)
{
   
	return p->next->data;
}

position Next(position p, DLIST L)
{
   
	position q;
	if (p->next == NULL)
	{
   
		cout << "不存在后继位置";
		return NULL;
	}
	else
	{
   
		q = p->next;
		return q;
	}
}

position First(DLIST L)
{
   
	return L;
}

position End(DLIST L)
{
   
	position q = L;
	while (q->next != NULL)
		q = q->next;
	return q;
}

int Swap(ElemType x, DLIST& L)
{
   
	position p = Locate(x, L);
	if (NULL == p)
	{
   
		return 0;
	}
	if (Next(First(L), L) == p)
	{
   
		// Do Nothing
	}
	else if (End(L) == p)
	{
   
		p->prior->next = NULL;
		p->next = p->prior;
		p->prior = p->prior->prior;
		p->prior->next = p;
		p->next->prior = p;
	}
	else
	{
   
		position tmp = p->prior;
		p->prior->next = p->next;
		p->next->prior = p->prior;
		p->prior = p->prior->prior;
		p->prior->next = p;
		p->next = tmp;
		p->next->prior = p;
	}
	return 1;
}

int main()
{
   
	DLIST dList = nullptr;
	MakeNull(dList);
	Insert(3, End(dList), dList);
	Insert(1, End(dList), dList);
	Insert(4, End(dList), dList);
	Insert(1, End(dList), dList);
	Insert(5, End(dList), dList);
	Insert(9, End(dList), dList);
	Insert(2, End(dList), dList);
	Insert(6, End(dList), dList);
	for (position i = First(dList); i != End(dList); i = Next(i, dList))
	{
   
		cout << Retrieve(i, dList) << ' ';
	}
	cout << endl;
	Swap(6, dList);
	for (position i = First(dList); i != End(dList); i = Next(i, dList))
	{
   
		cout << Retrieve(i, dList) << ' ';
	}
	cout << endl;
}