单链表的C语言简单实现,参考《数据结构与算法分析—C语言描述》
#ifndef _List_h
#define _List_h
struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
List CreatListHead(int N);
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P, List L);
Position Find(ElementType X, List L);
Position FindPrevious(ElementType X, List L);
void Delete(ElementType X, List L);
void Insert(ElementType X, int index, List L);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P);
ElementType Retrieve(Position P);
void PrintList(List L, int N);
#endif // _List_h
#include <stdio.h>
#include <stdlib.h>
#include "List.h"
struct Node
{
ElementType Element;
Position Next;
};
int IsEmpty(List L)
{
return L->Next == NULL;
}
int IsLast(Position P, List L)
{
return P->Next == NULL;
}
Position Find(ElementType X, List L)
{
Position P;
P = L->Next;
while(P != NULL && P->Element != X)
P = P->Next;
return P;
}
Position FindPrevious(ElementType X, List L)
{
Position P;
P = L;
while (P->Next != NULL && P->Next->Element != X)
P = P->Next;
return P;
}
void Delete(ElementType X, List L)
{
Position P, tmp;
P = FindPrevious(X, L);
if(!IsLast(P,L))
{
tmp = P->Next;
P->Next = tmp->Next;
free(tmp);
}
}
void Insert(ElementType X, int index, List L)
{
Position tmp;
Position P;
int count = 1;
P = L->Next;
while (P && count < index - 1)
{
P = P->Next;
count++;
}
tmp = malloc(sizeof(struct Node));
if(tmp == NULL)
printf("out of space\n");
tmp->Element = X;
tmp->Next = P->Next;
P->Next = tmp;
}
void DeleteList(List L)
{
Position P,Tmp;
P = L->Next;
L->Next = NULL;
while(P != NULL)
{
Tmp = P->Next;
free(P);
P = Tmp;
}
}
/* 产生N个元素的值,建立带表头结点的单链线性表L(头插法)*/
List CreatListHead(int N)
{
Position P;
int i;
//srand(time(0));
List L = (List) malloc(sizeof(struct Node));
L->Next = NULL;
for(i = 0; i < N; i++)
{
P = (Position)malloc(sizeof(struct Node));
P->Element = i + 1;
P->Next = L->Next;
L->Next = P;
}
return L;
}
void PrintList(List L, int N)
{
int i;
Position P = L->Next;
for(i = 0; i < N; i ++)
{
printf("%d ",P->Element);
P = P->Next;
}
printf("\n");
}
int main()
{
List L = CreatListHead(5);;
PrintList(L,5);
Insert(8, 3, L);
PrintList(L, 6);
Delete(3, L);
PrintList(L, 5);
DeleteList(L);
system("pause");
return 0;
}