数据结构之单链表(参考并整理严蔚蓝数据结构)

#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct node
{
	ElemType data;
	struct node *pNext;
}Node, *pNode;
void InitList(pNode &pHead)
{
	pHead = new Node;
	pHead->pNext = NULL;
	return;
}
void CreateAList(pNode &pHead, int count)
{
	pNode pTail = pHead;
	for (int i = 1; i <= count; i++)
	{
		pNode pNew = new Node;
		cin >> pNew->data;
		pNew->pNext = NULL;
		pTail->pNext = pNew;
		pTail = pNew;
		pNew = NULL;
	}
	return;
}
void CreateDList(pNode &pHead, int count)
{
	for (int i = 1; i <= count; i++)
	{
		pNode pNew = new Node;
		cin >> pNew->data;
		pNew->pNext = pHead->pNext;
		pHead->pNext = pNew;
	}
	return;
}
void DestroyList(pNode &pHead)//包括头节点也被删除,即达到pHead==NULL
{
	pNode pTem = NULL;
	while (pHead)
	{
		pTem = pHead;
		pHead = pHead->pNext;
		delete pTem;
	}
	return;
}
void ClearList(pNode &pHead)//只剩头节点
{
	pNode pTem = NULL;
	while (pHead->pNext)
	{
		pTem = pHead->pNext;
		pHead->pNext = pHead->pNext->pNext;
		delete pTem;
	}
	return;
}
pNode Locate(pNode pHead, ElemType e)//返回元素在链表中的指针
{
	pNode pTem = pHead->pNext;
	while (pTem&&pTem->data != e)
		pTem = pTem->pNext;
	return pTem;
}
bool GetElem(pNode pHead, int pos, ElemType &e)
{
	pNode pTem = pHead->pNext; int i = 1;
	while (pTem&&i<pos)
	{
		pTem = pTem->pNext; i++;
	}
	if (!pTem || i > pos)
		return false;
	else
	{
		e = pTem->data;
		return true;
	}
}
pNode PriorElem(pNode pHead, pNode pCur)//返回当前元素的上一个元素的针
{//未解决第一个元素的前驱的元素问题
	pNode pTem = pHead;
	if (pHead->pNext == pCur)//检测第一个结点
		return NULL;
	while (pTem->pNext&&pTem->pNext != pCur)
		pTem = pTem->pNext;
	if (pTem->pNext == pCur)
		return  pTem;
	else
		return NULL;

}
pNode NextElem(pNode pHead, pNode pCur)
{//未解决最后一个元素的后继问题
	pNode pTem = pHead->pNext;
	while (pTem&&pTem != pCur)
		pTem = pTem->pNext;
	if (pTem) pTem = pTem->pNext;
	return pTem;
}
bool ListInsert(pNode &pHead, int pos, ElemType e)
{
	pNode pTem = pHead; int i = 0;
	while (pTem&&i < pos - 1)
	{
		pTem = pTem->pNext; i++;
	}
	if (!pTem&&i > pos - 1)
		return false;
	else
	{
		pNode pNew = new Node;
		pNew->data = e;
		pNew->pNext = pTem->pNext;
		pTem->pNext = pNew;
		pTem = pNew = NULL;
		return true;
	}
}
bool ListDelete(pNode &pHead, int pos, ElemType &e)
{
	pNode pTem = pHead; int i = 0;
	while (pTem->pNext&&i < pos - 1)
	{
		pTem = pTem->pNext; i++;
	}
	if (!(pTem->pNext) && i > pos - 1)
		return false;
	else
	{
		pNode p = pTem->pNext;
		e = p->data;
		pTem->pNext = p->pNext;
		delete p;
		p = NULL;
		return true;
	}
}
void DeleteBetween(pNode &pHead, int min, int max)//delete bewteen min and max
{//有序递增链表
	pNode pRe = pHead;
	pNode pTem = pHead->pNext;
	pNode pStar = NULL;//开始要删除元素的针
	pNode pCur = NULL;//当前待删元素的针
	while (pTem&&pTem->data <min)
	{
		pRe = pTem; pTem = pTem->pNext;
	}
	if (pTem)//pRe固定
	{
		while (pTem&&pTem->data <= max)
			pTem = pTem->pNext;//pTem为最后要删除元素的指针域存放的指针值
		pStar = pRe->pNext;
		pRe->pNext = pTem;//将剩余元素链接起来
		while (pStar != pTem)
		{
			pCur = pStar; pStar = pStar->pNext; delete pCur;
		}
	}
	return;

}
void DeleteEqual(pNode &pHead)//元素递增排列
{
	pNode p = pHead->pNext;//
	pNode q = p->pNext;
	while (q)
	{
		if (p->data != q->data)
		{
			p = q; q = q->pNext;
		}
		else
		{
			q = q->pNext;
			delete p->pNext;
			p->pNext = q;
		}
	}
	return;
}
int ListLength(pNode pHead)
{
	int len = 0; pNode pTem = pHead->pNext;
	while (pTem)
	{
		pTem = pTem->pNext; ++len;
	}
	return len;
}
void ListConcat(pNode pHeadA, pNode pHeadB, pNode &pHeadC)
{
	pNode pTem = pHeadA;
	pHeadC = pHeadA;
	while (pTem->pNext)
		pTem = pTem->pNext;
	pTem->pNext = pHeadB->pNext;
	return;
}
void ListUnion(pNode &pHeadA, pNode pHeadB)//将所有在线性表B中但不再A中的数据元素插入到A中
{
	int lena=ListLength(pHeadA);//A的长度
	int lenb=ListLength(pHeadB);//B的长度
	ElemType e;
	for (int i = 1; i <= lenb; i++)
	{
		GetElem(pHeadB, i, e);//取B中第i个数据元素赋值给e
		if (!Locate(pHeadA, e))//如果e在A中不存在
			ListInsert(pHeadA, ++lena, e);//插入A的尾部
	}
}
void ListMerge(pNode pHeadA, pNode pHeadB, pNode &pHeadC)
{//归并两个值非递减的单链表为一个值非递减的新表
	int Lena = ListLength(pHeadA);
	int Lenb = ListLength(pHeadB);
	ElemType a,b;
	int i = 1, j = 1, k = 0;
	InitList(pHeadC);
	while ((i <= Lena) && j <= Lenb)
	{
		GetElem(pHeadA, i, a);
		GetElem(pHeadB, j, b);
		if (a <= b)
		{
			ListInsert(pHeadC, ++k, a);
			++i;
		}
		else
		{
			ListInsert(pHeadC, ++k, b);
			j++;
		}
	}
	while (i <= Lena)//如果i<=Lena,则B已经插入完毕
	{
		GetElem(pHeadA, i++, a);
		ListInsert(pHeadC, ++k, a);
	}
	while (j <= Lenb)//如果j<=Lenb,则A已经插入完毕
	{
		GetElem(pHeadB, j++, b);
		ListInsert(pHeadC, ++k, b);
	}
	return;
}
void MergeList(pNode &pHeadA, pNode &pHeadB, pNode &pHeadC)//同上
{//原先的A,B皆被破坏
	pNode pA, pB, pC;
	pHeadC = pHeadA;
	pA = pHeadA->pNext;
	pB = pHeadB->pNext;
	pC = pHeadA;
	while (pA&&pB)
	{
		if (pA->data <= pB->data)
		{
			pC->pNext = pA; pC = pA; pA = pA->pNext;
		}
		else
		{
			pC->pNext = pB; pC = pB; pB = pB->pNext;
		}
	}
	if (pA)
		pC->pNext = pA;
	else
		pC->pNext = pB;
	delete(pHeadB);
	return;
}
void ListCrossMerge(pNode &pHeadA, pNode &pHeadB, pNode &pHeadC)//在A,B的基础上形成C.A,B中的元素间隔排列.A,B不再存在
{
	pNode pA = pHeadA->pNext;
	pNode pB = pHeadB->pNext;
	pHeadC = pHeadA;
	pNode pTemA = NULL, pTemB = NULL;
	while (pA&&pB)
	{
		pTemA = pA->pNext; pA->pNext = pB;//将B元素插入
		if (pTemA)
		{
			pTemB = pB->pNext; pB->pNext = pTemA;//将A元素插入
		}
		pA = pTemA; pB = pTemB;
	}
	return;
}
void ReverseMerge(pNode &pHeadA, pNode &pHeadB, pNode &pHeadC) // 把元素递增排列的链表A和B合并为C,
//且C中元素递减排列, 使用原空间
{
	pNode pA = pHeadA->pNext;
	pNode pB = pHeadB->pNext;
	pNode pC = NULL;
	pNode pRe = NULL;
	pNode pTem = NULL;
	while (pA&&pB)
	{
		if (pA->data < pB->data || !pB)
		{
			pC = pA; pTem = pA->pNext; pA->pNext = pRe; pA = pTem;
		}
		else
		{
			pC = pB; pTem = pB->pNext; pB->pNext = pRe; pB = pTem;
		}
		pRe = pC;
	}
	pHeadC = pHeadA; pHeadA->pNext = pC;
	return;
}
void ListTraverse(pNode pHead)
{
	pNode pTem = pHead->pNext;
	while (pTem)
	{
		cout << pTem->data << " ";
		pTem = pTem->pNext;
	}
	cout << endl;
	return;
}
int main(void)
{

	pNode pHeadA,pHeadB,pHeadC;
	InitList(pHeadA);
	InitList(pHeadB);
	CreateAList(pHeadA, 4);
	CreateAList(pHeadB, 5);
	ListTraverse(pHeadA);
	ListTraverse(pHeadB);
	MergeList(pHeadA, pHeadB, pHeadC);
	ListTraverse(pHeadA);
	ListTraverse(pHeadC);
/*
    ListMerge(pHeadA, pHeadB, pHeadC);
	ListTraverse(pHeadA);
	ListTraverse(pHeadB);
	ListTraverse(pHeadC);
*/
/*
	ListUnion(pHeadA, pHeadB);
	ListTraverse(pHeadA);
*/
	/*	pNode pTem = Locate(pHead, 3);
	pTem = NextElem(pHead, pTem);
	cout << pTem->data << endl;
	*/
/*	pNode pTem = Locate(pHead, 2);
	pTem = PriorElem(pHead, pTem);
	cout << pTem->data << endl;	
*/
	/*
	ClearList(pHead);
	if (!pHead->pNext)
	cout << "Indeed Clear!" << endl;
	else
	cout << "Not Clear!" << endl;
	*/
	/*
	DestroyList(pHead);
	if (pHead)
	cout << "Not Destroy!" << endl;
	else
	cout << "Indeed Destroy!" << endl;
	*/
	/*
	pNode pHeadA = NULL;
	pNode pHeadB = NULL;
	pNode pHeadC = NULL;
	InitList(pHeadA);
	InitList(pHeadB);
	CreateAList(pHeadA,3);
	CreateAList(pHeadB,3);
	ListCrossMerge(pHeadA, pHeadB, pHeadC);
	ListTraverse(pHeadC);
	*/
	/*
	pNode pHeadA = NULL, pHeadB = NULL, pHeadC = NULL;
	InitList(pHeadA);
	InitList(pHeadB);
	CreateAList(pHeadA,4);
	CreateAList(pHeadB,5);
	ListTraverse(pHeadA);
	ListTraverse(pHeadB);
	ListConcat(pHeadA, pHeadB, pHeadC);
	ListTraverse(pHeadC);
	*/

	/*	pNode pHead = NULL;
	ElemType e = 0;
	InitList(pHead);
	CreateAList(pHead, 6);//CreateDList(pHead,6);
	ListTraverse(pHead);
	DeleteEqual(pHead);
	ListTraverse(pHead);
	*//*
	DeleteBetween(pHead, 2, 5);
	ListTraverse(pHead);
	*/
	/*
	cout << "The Length of The List is " << ListLength(pHead) << endl;
	ListTraverse(pHead);
	GetElem(pHead, 2, e);
	cout << e << endl;
	ListInsert(pHead, 7, 7);
	cout << "The Length of The List is " << ListLength(pHead) << endl;
	ListTraverse(pHead);
	ListDelete(pHead, 7, e);
	cout << e << endl;
	cout << "The Length of The List is " << ListLength(pHead) << endl;
	ListTraverse(pHead);
	*/
	return(0);

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值