/**********************************************************
* 链表的基本操作(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);
}