自己写的一个基于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);
}

  

posted @ 2015-09-09 15:27  玩呀熊熊  阅读(191)  评论(0编辑  收藏  举报