• 自己写的一个基于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("申请内存失败
    ");
    		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("申请内存失败
    ");
    	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不应该大于链表长度!
    ");
    		return FALSE;
    	}
    	else
    	{
    		while(i<pos-1)
    		{
    		p=p->next;
    		i++;
    		}
    
    	 New=(NODE*)malloc(SIZE);
    	 if(NULL==New)
    	 {
    	    printf("申请内存失败
    ");
            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
    ",i,p->dat.val_0,p->dat.val_1);
    	}
    	printf("TEST OVER,Length=%d
    
    
    ",Length);
    }
    

      

  • 相关阅读:
    todo: SDC
    2017-2018-2 实验四《Android程序设计》实验报告
    《Java程序设计》第十周课下作业
    2017-2018-2 实验三 《Java面向对象程序设计》实验报告
    《Java程序设计》第九周学习总结
    结对编程练习_四则运算(第二周)
    《Java程序设计》第八周学习总结
    2017-2018-2 实验二 《Java面向对象程序设计》实验报告
    结对编程练习_四则运算(第一周)
    《Java程序设计》第七周学习总结
  • 原文地址:https://www.cnblogs.com/wan0807/p/4794843.html
Copyright © 2020-2023  润新知