链表操作 <-请戳这里(这个博主写的东西挺好,谢谢他)
修改其中的一些地方。
1. 可以删除节点。
2. 插入的时候按下标插入比较方便。
3. typedef 使用需要注意。
#include <iostream>
#include <cstdlib>
using namespace std;
struct Node;
typedef struct Node *PtrNode;
typedef PtrNode List;
typedef PtrNode Position;
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P, List L);
Position Find(int X, List L);
void Delete(int X, List L);
Position FindPrevious(int X, List L);
void Insert(int X, List L, Position P);
void DeleteList(List L);
void Print(List L);
struct Node
{
int Element;
Position Next;
};
void Print(List L)
{
Position P;
P = L->Next;
cout<<"Print start\n";
while (P != NULL)
{
cout<<P->Element<<" ";
P = P->Next;
}
cout<<endl;
}
int IsEmpty(List L)
{
return L->Next == NULL;
}
int IsLast(Position P, List L)
{
return P->Next == NULL;
}
Position Find(int X, List L)
{
Position P;
P = L->Next;
while (P->Element != X && P != NULL)
{
P = P->Next;
}
return P;
}
Position FindPrevious(int X, List L)
{
Position P;
P = L;
while (P->Next != NULL)
{
if(P->Next->Element == X)
{
break;
}
P = P->Next;
}
return P;
}
void Delete(int X, List L)
{
Position P;
P = FindPrevious(X, L);
Position tmp;
if (!IsLast(P, L))
{
cout<<"Delete success\n";
tmp = P->Next;
P->Next = tmp->Next;
free(tmp);
}
else
{
cout<<X<<" not exists.\n";
}
}
void Insert(int X, List L, int P)
{
Position tmp = (Position)malloc(sizeof(struct Node));//需要开辟空间
if (tmp == NULL) //判断空间申请是否失败
{
cout<<"out of memory in fun Insert\n";
}
while(P--)//计算插入的位置
{
L=L->Next;
}
tmp->Element = X;
tmp->Next = L->Next;
L->Next = tmp;
}
void DeleteList(List L)
{
Position P, tmp;
P = L->Next;
tmp = P->Next;
while (P != NULL)
{
free(P);
if (tmp == NULL)
{
break;
}
P = tmp;
tmp = P->Next;
}
L->Next = NULL;
}
int main(int argc, const char * argv[])
{
List L = (List)malloc(sizeof(struct Node));
L->Next=NULL;
Insert(1, L, 0);
Insert(3, L, 1);
Insert(5, L, 2);
Print(L);
Position P = Find(3, L);
cout<<P->Element<<endl;
P = FindPrevious(3, L);
Delete(2, L);
Print(L);
Delete(1, L);
Print(L);
DeleteList(L);
Print(L);
return 0;
}