单向链表的基本操作以及结点数据去重的两种方法

	#include <stdio.h>

include<stdlib.h>

typedef long ElemType;
#define ERROR 0
#define OK 1
typedef struct Node
{
	ElemType Data;
	struct Node* PNext;
}Node;

int CountNum;
void CreateNode(Node** List)//创建一个链表,且赋值从0开始
{
	Node* NewNode = (Node*)malloc(sizeof(Node));
	if (!NewNode) exit(1);
	NewNode->PNext = NULL;
	NewNode->Data = CountNum++;
	(*List)->PNext = NewNode;
	*List = NewNode;
}
ElemType GetElem(Node* TrvP, int n)//返回链表中第n个元素的值
{
	int i = 1;
	for (TrvP = TrvP->PNext; TrvP && i < n; i++) TrvP = TrvP->PNext;
	if (n < i || !TrvP) return ERROR;
	return TrvP->Data;
}

int InsertLine(Node* TrvP, int n, ElemType NewData)//在第n位置插入一个结点
{

	int i = 0;
	while (TrvP && i < n - 1)
	{
		TrvP = TrvP->PNext;
		i++;
	}

	if (!TrvP || i > n - 1) return ERROR;

	Node* InsertNode = (Node*)malloc(sizeof(Node));

	InsertNode->Data = NewData;
	InsertNode->PNext = TrvP->PNext;
	TrvP->PNext = InsertNode;
}

int DeleteItem(Node* TrvP, int n)//删除第n个结点
{
	int i = 0;
	while (TrvP->PNext && i < n - 1)
	{
		TrvP = TrvP->PNext;
		i++;
	}
	if (i > n - 1 || !TrvP->PNext) return ERROR;
	Node* Temp = TrvP->PNext;
	TrvP->PNext = Temp->PNext;
	free(Temp);
	return OK;

}

int ClearItem(Node* HNodeP)//清空一个链表
{
	Node* Temp;
	while (HNodeP)
	{
		Temp = HNodeP->PNext;
		free(HNodeP);
		HNodeP = Temp;
	}
	return OK;
}
//在链表中删除相同数据的结点,采取的方法是创建一个新的链表,新的数据加入到新链表当中,重复的跳过,时间复杂度是n平方
Node* Dele_Same_One(Node* TrvP)
{

	Node* NewHead = (Node*)malloc(sizeof(Node));
	NewHead->PNext = NULL;
	Node* NewList = NewHead;
	Node* Temp = TrvP->PNext;
	int Tag;
	for (; Temp; Temp = Temp->PNext)
	{
		Tag = 0;
		NewList = NewHead;
		for (; NewList->PNext; NewList = NewList->PNext)
		{
			if (NewList->PNext->Data == Temp->Data)
			{
				Tag = 1;
				break;
			}
		}
		if (!Tag)
		{
			Node* NewNode = (Node*)malloc(sizeof(Node));
			NewNode->Data = Temp->Data;
			NewNode->PNext = NULL;
			NewList->PNext = NewNode;
		}
	}
	return NewHead;
}
//第二种方法节约空间,因为在原来链表基础上,把头和后面的结点分离,把含不同数据的结点移动到头上,相同的释放,且接过来的放在头结点的后面使得顺序发生改变
Node* Dele_Same_Two(Node* TrvP)
{
	Node* NewHead = TrvP;
	TrvP = TrvP->PNext;
	NewHead->PNext = NULL;
	while (TrvP)
	{
		Node* succ = TrvP->PNext;//记录TrvP下一个结点
		Node* NewList = NewHead->PNext;
		while (NewList && NewList->Data != TrvP->Data)
		{
			NewList = NewList->PNext;
		}
		if (!NewList)
		{
			TrvP->PNext = NewHead->PNext;
			NewHead->PNext = TrvP;
		}
		else
		{
			free(TrvP);
		}
		TrvP = succ;
	}
	return NewHead;
}

int main()
{
	Node* HNode = (Node*)malloc(sizeof(Node));//头指针,不会被修改的指针
	HNode->PNext = NULL;
	Node* List = HNode;//尾指针,用于添加元素
	Node* TrvP = HNode;//遍历指针,用其遍历链表
	for (int i = 0; i < 10; i++) CreateNode(&List);

	InsertLine(TrvP, 1, 5);
	InsertLine(TrvP, 12, 7);
	InsertLine(TrvP, 13, 14);
	Node* Text1 = Dele_Same_One(HNode);
	Node* Text2 = Dele_Same_Two(HNode);
	for (Node* p = Text1->PNext; p; p = p->PNext)printf("%d\n", p->Data);
	for (Node* p = Text2->PNext; p; p = p->PNext)printf("%d\n", p->Data);


	//InsertLine(TrvP, 1, 100);
	//DeleteItem(TrvP, 3);
	//for (Node* p=HNode->PNext;p; p = p->PNext)printf("%d\n", p->Data);

}
posted @ 2021-03-14 22:53  empty_thought  阅读(230)  评论(0)    收藏  举报