链表由一系列不必在内存中相连的结构组成。每一个结构均含有表元素和指向包含该元素后继元的结构的指针。我们称为Next指针。最后一个单元的Next指针指向NULL;该值有C标准定义并且不能与其他指针相混淆。ASCII C 规定 NULL 为 零。
list.h
#ifndef _LIST_H_
#define _LIST_H_
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;
//初始话链表
List InitList(void);
//空链表
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 Insert(ElementType X, List L, Position P);
//删除链表
void DeleteList(List L);
//返回链表头节点
Position Header(List L);
//返回链表第一个数据元素节点
Position First(List L);
//返回当前位置的下一个位置
Position Advance(Position P);
//获取当前位置的值
ElementType Retrieve(Position P);
//删除链表的某一个值
void Delete(ElementType X, List L);
#endif
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
struct Node
{
ElementType Element;
Position Next;
};
/*
struct Node
{
ElementType Element;
Position Next;
}
这仅仅是一个结构体的声明
此时如果需要声明内存空间的话
需要malloc(sizeof(struct Node))这样写
*/
//初始化链表
List InitList(void)
{
List L;
L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
return L;
}
//创建一个新的空链表
List MakeEmpty(List L)
{
if (L != NULL)
DeleteList( L );
L = (List)malloc( sizeof( struct Node ));
if(L == NULL){
printf("Out of memory!!!");
exit(1);
}
L->Next = NULL;
return L;
}
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;
}
void Insert(ElementType X, List L, Position P)
{
Position TmpCell;
TmpCell = malloc(sizeof(struct Node));
if(TmpCell == NULL){
printf("Out of memory ! \n");
return;
}
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
//删除链表
void DeleteList(List L)
{
Position P,TemPos;
P = L->Next; //
while(P != NULL)
{
TemPos = P->Next;
free(P);
P = TemPos;
}
}
//返回链表头节点
Position Header(List L)
{
return L;
}
Position First(List L)
{
return L->Next;
}
//返回当前位置的下一个位置
Position Advance(Position P)
{
return P->Next;
}
//获取当前位置的值
ElementType Retrieve(Position P)
{
return P->Element;
}
void Delete(ElementType X, List L)
{
Position P;
P = L->Next;
while(P != NULL && P->Element != X){
P = P->Next;
}
if(P != NULL)
free(P);
}
Position FindPrevious( ElementType X, List L )
{
Position P;
P = L;
while( P->Next != NULL && P->Next->Element != X )
P = P->Next;
return P;
}