自己写的一个基于C的单向链表
/********************************************************** * 链表的基本操作(C语言) * *文件:list.c *作者:Mr Wan *描述:实现链表的初始化、添加、删除等等 *编写时间:2015.9.7 * *修改日期:2015.9.9 *修改人:Mr Wan *修改内容:将之前创建链表函数,分为了链表表头初始化 * 以及添加节点函数;新定义变量链表长度Length * 将以前节点的数据用结构体进行封装,方便扩展 *版本:1.1 ***********************************************************/ #include<stdio.h> #include<stdlib.h> #define SIZE sizeof(NODE) //每个节点所占内存大小 static unsigned int Length=0;//定义全局变量,表示链表的长度,即除去头结点外的节点总数 typedef enum { FALSE=0, TRUE=1 }BOOL;//自定义BOOL型枚举变量 typedef struct { int val_0; int val_1; }DAT;//定义数据结构体 typedef struct { DAT dat;//节点数据段 struct NODE *next;//指向下一个节点的指针 }NODE;//定义结构体用于表示节点 NODE* InitList(void); BOOL AddNode(NODE* Head,DAT dat); BOOL AddNodeAt(NODE* Head,unsigned int pos,DAT dat); BOOL DeleteNode(NODE* Head,unsigned int n); void ListTest(NODE* Head); void main() { unsigned int i=0; NODE *List=NULL;//定义指向链表的指针 DAT dat; List=InitList(); for(i=0;i<10;i++) { dat.val_0=i*10+i; dat.val_1=i*5+i; AddNode(List,dat); } ListTest(List); AddNodeAt(List,5,dat); ListTest(List); DeleteNode(List,5); ListTest(List); } /********************************************************** ** NODE* InitList(void) ** **功能:初始化一个链表,并返回其头指针 **输入:void **输出:链表的头指针 ** **********************************************************/ NODE* InitList(void) { NODE *Head=(NODE*)malloc(SIZE);//定义链表头指针 if(NULL==Head) { printf("申请内存失败\n"); return; } else { Head->next=NULL; Length=0; return Head; } } /********************************************************** ** BOOL AddNode(NODE* Head,DAT dat) ** **功能:向一个已知链表后面增加一个节点,并添加数据 **输入:已知链表的头指针,增加节点的数据 **输出: TRUE--添加成功,FALSE--添加失败 ** **********************************************************/ BOOL AddNode(NODE* Head,DAT dat) { unsigned int i=0; NODE* New=NULL;//待添加的节点 NODE* p=Head; while(i<Length) { p=p->next; i++; }//while New=(NODE*)malloc(SIZE); if(NULL==New) { printf("申请内存失败\n"); return FALSE; } else { New->dat=dat; p->next=New; New->next=NULL; Length++; return TRUE; }//else } /********************************************************** ** BOOL AddNodeAt(NODE *Head,unsigned int pos,DAT dat) ** **功能:向一个已知的链表中位置pos之前添加节点 **输入:Head---已知链表的指针、pos---添加的位置、 ** dat---被添加节点中存放的数据 **输出:BOOL型结果----TRUE表示成功/FALSE表示失败 ** **********************************************************/ BOOL AddNodeAt(NODE *Head,unsigned int pos,DAT dat) { unsigned int i=0; NODE* p=Head; NODE* New=NULL; if(pos>Length) { printf("pos不应该大于链表长度!\n"); return FALSE; } else { while(i<pos-1) { p=p->next; i++; } New=(NODE*)malloc(SIZE); if(NULL==New) { printf("申请内存失败\n"); return FALSE; } else { New->next=p->next; p->next=New; New->dat=dat; Length++; return TRUE; }//else }//else } /********************************************************** ** BOOL DeleteNode(NODE* Head,unsigned int n) ** **功能:将已知链表中第n个节点删除 **输入:Head---已知链表的指针、n---待删节点序号 **输出:BOOL型结果----TRUE表示成功/FALSE表示失败 ** **********************************************************/ BOOL DeleteNode(NODE* Head,unsigned int n) { unsigned int i=0; NODE* p=Head; NODE* q=NULL; while(i<n-1) { p=p->next; i++; } q=p->next; p->next=q->next; Length--; free(q); q=NULL; } /********************************************************** ** void ListTest(NODE *Head) ** **功能:用于测试链表 **输入:待测链表头指针 **输出: void ** **********************************************************/ void ListTest(NODE *Head) { unsigned int i=0; NODE *p=Head; while((NULL!=p)&&(i<Length)) { i++; p=p->next; printf("Node%d数据段中val_0=%d,val_1=%d\n",i,p->dat.val_0,p->dat.val_1); } printf("TEST OVER,Length=%d\n\n\n",Length); }