zoukankan      html  css  js  c++  java
  • 自己写的一个基于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);
    }
    

      

  • 相关阅读:
    深入了解 Flink 网络栈(二):监控、指标和处理背压
    物联网安全技术提高区块链应用数据的可信度
    威胁快报|Bulehero挖矿蠕虫升级,PhpStudy后门漏洞加入武器库
    Ververica Platform-阿里巴巴全新Flink企业版揭秘
    重磅 | 阿里云与MongoDB达成战略合作,成为全球唯一提供最新版MongoDB的云厂商
    阿里巴巴叶军:政企数字化转型,现在是最重要的时机
    Canonical 开源 MicroK8 | 云原生生态周报 Vol. 25
    nyoj42——连通图加欧拉(连通图板子)dfs
    nyoj38——最小生成树
    nyoj20——有向无环图深搜模板
  • 原文地址:https://www.cnblogs.com/wan0807/p/4794843.html
Copyright © 2011-2022 走看看