欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-11 22:27:21
...

链表作为一种基本的数据结构在程序开发过程当中经常会使用到。要靠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;
   }


}

程序运行结果如下:
C语言实现不带头结点的单向链表(头插法)并实现用头插法加新结点

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

函数声明:

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);//摧毁链表

程序运行结果如下:

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