#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);
}