这里单链表的基本知识就不介绍了,个人觉得单链表增加一个额外的表头结构操作更加方便,当然这个也可以不用增加,只需要修改部分程序就可以了。
List.h头文件程序如下:
/*
Author: Yuan Yuan
Date: 2014-06-15
*/
#ifndef __LIST_H_
#define __LIST_H_
struct Node;
typedef struct Node *PtrNode;
typedef PtrNode List;
typedef PtrNode Position;
struct Node
{
int data;
Position Next;
};
//清空单链表
List MakeEmpty(List L);
//测试单链表是否为空
int IsEmpty(List L);
//测试L是否是最后一个
int IsLast(Position P, List L);
//查找X的位置
Position Find(int X, List L);
//删除单链表中的X
void Delete(int X, List L);
//查找X的前一个位置
Position FindPrevious(int X, List L);
//将X插入到位置P之后
void Insert(int X, List L, Position P);
//删除单链表
void DeleteList(List L);
//返回单链表的表头位置
Position Header(List L);
//返回第一个元素的位置
Position First(List L);
//返回P后面一个位置
Position Advance(Position P);
//返回当前位置P里面的元素
int Retrieve(Position P);
#endif
List.c程序如下:
/*
Author: Yuan Yuan
Date: 2014-06-15
*/
#include "List.h"
#include <stdio.h>
#include <stdlib.h>
List MakeEmpty(List L)
{
if (L != NULL)
DeleteList(L);
L = (List) malloc(sizeof(struct Node));
if (L == NULL)
{
printf("Out of memory!\n");
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(int X, List L)
{
Position P;
P = L->Next;
while (P != NULL && P->data != X)
P = P->Next;
return P;
}
void Delete(int X, List L)
{
Position P, TmpCell;
P = FindPrevious(X, L);
if (!IsLast(P, L))
{
TmpCell = P->Next;
P->Next = TmpCell->Next;
free(TmpCell);
}
}
Position FindPrevious(int X, List L)
{
Position P;
P = L;
while (P->Next != NULL && P->Next->data != X)
{
P = P->Next;
}
return P;
}
void Insert(int X, List L, Position P)
{
Position TmpCell;
TmpCell = NULL;
TmpCell = (Position) malloc(sizeof(struct Node));
if (TmpCell == NULL)
{
printf("Out of memory!\n");
exit(1);
}
TmpCell->data = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
void DeleteList(List L)
{
Position P, TmpCell;
P = L->Next;
L->Next = NULL;
while (P != NULL)
{
TmpCell = P->Next;
free(P);
P = TmpCell;
}
}
Position Header(List L)
{
return L;
}
Position First(List L)
{
return L->Next;
}
Position Advance(Position P)
{
return P->Next;
}
int Retrieve(Position P)
{
return P->data;
}
单链表测试程序如下:
/*
Author: Yuan Yuan
Date: 2014-06-15
*/
#include <stdio.h>
#include "List.h"
void PrintList(const List L)
{
Position P = Header(L );
if(IsEmpty(L))
printf( "Empty list\n" );
else
{
do
{
P = Advance(P);
printf( "%d ", Retrieve(P));
} while(!IsLast(P, L));
printf( "\n" );
}
}
int main(void)
{
List L;
Position P;
int i;
L = MakeEmpty(NULL);
P = Header(L);
printf("输出没有插入数据之前的单链表……\n");
PrintList(L);
printf("插入0-10个数到单链表中……\n");
for(i = 0; i < 10; i++)
{
Insert(i, L, P);
PrintList(L);
P = Advance(P);
}
printf("删除单链表中部分数据……\n");
for( i = 0; i < 10; i += 2)
Delete(i, L);
for(i = 0; i < 10; i++)
if((i % 2 == 0) == (Find(i, L) != NULL))
printf("Find %d failed!\n", i);
printf("输出单链表中的数据……\n");
PrintList(L);
DeleteList(L);
return 0;
}
测试结果如下: