C语言实现不带头结点的单向链表(头插法)并实现用头插法加新结点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38022615/article/details/82021654

链表作为一种基本的数据结构在程序开发过程当中经常会使用到。要靠C语言来实现链表主要就是依靠结构体和指针。
链表是一种线性存储数据的结构,存储内容在逻辑上连续的,在物理上却不一定连续。
首先说说单向链表的C语言实现方法。为了实现一个单向链表,首先定义一个结构体:

typedef struct _node_s
{

    int             fd;
    int             data;
    struct _node_s  *next;
}node_t;

下面来编写程序实现一个链表的创建。该程序的功能是首先分配5个链表元素(node),然后对这些链表元素进行赋初值,赋完初值之后将这些链表元素依次加入到链表当中。创建链表后遍历整个链表,最后再摧毁链表。代码如下:

/*********************************************************************************
 *      Copyright:  (C) 2018 Dinghuanhuan<736787419@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  head_link.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(08/24/2018)
 *         Author:  Dinghuanhuan <736787419@qq.com>
 *      ChangeLog:  1, Release initial version on "08/24/2018 10:28:57 AM"
 *                 
 ********************************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct _node_s
{

    int             fd;
    int             data;
    struct _node_s  *next;
}node_t;


int   travel_node(node_t  *head);//遍历链表
void destry(node_t * head);//摧毁链表


int main(int argc, char **argv)
{

    node_t     *node = NULL;
    node_t     *head = NULL;
    int        i;

    //创建5个结点的链表
    for(i=0;i<5;i++)
    {
        node  = malloc(sizeof(*node));
        if(NULL == node)
        {
            printf("malloc failure.\n");
            return -1;
        }
        else
        {
            node ->fd   = i;
            node ->data = i+1;
            node ->next = NULL;
            if(NULL == head)
            {
                head = node;
                printf("add  node[%d]: %d\n",node->fd,node->data);
            }
            else
            {
                node -> next =  head; 
                head         =  node;
                printf("add node[%d]: %d\n",node->fd,node->data);
            }
        }


    }
    travel_node(head);//遍历整个链表
    destry( head);//摧毁链表
    return 0;
}



int travel_node(node_t  *head)
{

    node_t   *temp = head;
    if(NULL == head)
    {
        printf("travel_node is failure \n");
        return -2;
    }

    while(temp)
    {

        if(temp ->next == NULL)
        {
            printf("travel_node[%d]: %d\n",temp->fd,temp->data);
            printf("travel_node finish\n");
            return 0;
        }   
        else
        {
            printf("travel_node[%d]: %d\n",temp->fd,temp->data);
            temp = temp->next;

        }
    }
    return 0;

}
void destry(node_t * head)
{
   node_t  * node = head;

   while(node != NULL)
   {
       head = head->next;
       printf("destroy[%d]\n",node->fd);
       free(node);
       node = head;
   }


}

程序运行结果如下:
这里写图片描述

写一个函数用头插法方式加入新结点

函数声明:

node_t * insert_nodehead(node_t *head);

具体函数:

node_t *  insert_nodehead(node_t *head)
{
    node_t   * new_node = NULL;

    new_node   = malloc(sizeof(*new_node));

    if(new_node == NULL)
    {
        printf("add node malloc failure\n");
        return NULL ;
    }
    new_node ->fd    = 0xee;
    new_node ->data  = 0xff;
    new_node ->next  = NULL;

    if(head == NULL)
    {
        head = new_node;
        printf("add new node [%d]: %d\n",new_node->fd,new_node->data);
    }
    else
    {
        new_node ->next = head;
        head            = new_node;
        printf("add node [%d]: %d\n",head->fd,head->data);
    }

    return head;
}

在main函数中调用:
(创建链表后在完成for循环后)

    travel_node(head);//遍历链表
    head = insert_nodehead(head);//加入一个新的结点
    travel_node(head); //遍历新的链表
    destry( head);//摧毁链表

程序运行结果如下:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_38022615/article/details/82021654
今日推荐