03 单链表的实现

来源:互联网 发布:2016中国经济危机知乎 编辑:程序博客网 时间:2024/06/05 03:41

      这里单链表的基本知识就不介绍了,个人觉得单链表增加一个额外的表头结构操作更加方便,当然这个也可以不用增加,只需要修改部分程序就可以了。


List.h头文件程序如下:

/*Author: Yuan YuanDate: 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);//删除单链表中的Xvoid 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 YuanDate: 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 YuanDate: 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;}

测试结果如下:


0 0
原创粉丝点击