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;
}
}
程序运行结果如下:
写一个函数用头插法方式加入新结点
函数声明:
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);//摧毁链表
程序运行结果如下: