带头节点的单链表-------C语言实现

  1 /*****************************************************
  2 Author:Simon_Kly    Version:0.1    Date:20170520
  3 Description:带头接点的单链表
  4 Mail:[email protected]
  5 Funcion List:
  6 *****************************************************/
  7
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10
 11 typedef struct node
 12 {
 13     int data;
 14     struct node *next;
 15 }Node, *Link;
 16
 17 /*判断malloc是否正确执行*/
 18 void is_malloc_ok(Link head)
 19 {
 20     if (head == NULL)
 21     {
 22         printf("malloc error!\n");
 23         exit(-1);
 24     }
 25 }
 26
 27 /*建立链表*/
 28 void create_link(Link * head)
 29 {
 30     *head = (Link)malloc(sizeof(Node));
 31     is_malloc_ok(*head);
 32     (*head)->next = NULL;
 33 }
 34
 35 /*创建节点*/
 36 void create_node(Link * new_node)
 37 {
 38     *new_node = (Link)malloc(sizeof(Node));
 39     is_malloc_ok(*new_node);
 40 }
 41
 42 /*插入节点尾插*/
 43 void insert_node_tail(Link head, Link new_node)
 44 {
 45     Link p = NULL;
 46
 47     p = head;
 48
 49     while (p->next != NULL)
 50     {
 51         p = p->next;
 52     }
 53     p->next = new_node;
 54     new_node->next = NULL;
 55 }
 56
 57 /*插入节点头插*/
 58 void insert_node_head(Link head, Link new_node)
 59 {
 60     Link p = NULL;
 61
 62     p = head;
 63
 64     new_node->next = head->next;
 65     head->next = new_node;
 66 }
 67
 68 /*打印节点*/
 69 void output_link(Link head)
 70 {
 71     Link p = NULL;
 72
 73
 74     if (head == NULL)
 75     {//空链
 76         printf("link is empty!\n");
 77         return ;
 78     }
 79
 80     p = head->next;
 81     while (p != NULL)
 82     {
 83         printf("%d\n", p->data);
 84         p = p->next;
 85     }
 86 }
 87
 88 /*置空链*/
 89 void make_empty_link(Link *head)
 90 {
 91     Link p = NULL;
 92
 93     p = (*head)->next;
 94
 95     while ((*head)->next != NULL)
 96     {
 97         (*head)->next = (*head)->next->next;
 98         free(p);
 99         p = (*head)->next;
100     }
101 }
102
103 /*释放链表*/
104 void release_link(Link * head)
105 {
106     make_empty_link(head);
107     free(*head);
108     *head = NULL;
109 }
110
111 int main()
112 {
113     int i;
114
115     Link head = NULL;
116     Link new_node = NULL;
117
118     create_link(&head);
119
120     /*尾插*/
121     for (i = 0; i < 10; i++)
122     {
123         create_node(&new_node);
124         new_node->data = i + 1;
125         insert_node_tail(head, new_node);
126     }
127     output_link(head);
128
129     /*头插*/
130     create_node(&new_node);
131     new_node->data = 20;
132     insert_node_head(head, new_node);
133     output_link(head);
134
135     /*释放链表阶段*/
136     release_link(&head);
137     output_link(head);
138     return 0;
139 }

不带头结点代码传送门:http://www.cnblogs.com/SimonKly/p/6890287.html

可以从代码中看出,不带头结点的代码中插入节点的函数insert*中的参数是二级指针,因为头指针的指向可能会发生变化,需要用二级指针带回一级指针的地址。

而在带头结点的代码中在相同的插入节点的函数insert*中的参数是一级指针并没有使用二级指针,因为带头结点的链表中头结点是真真实实存在,在create*中分配空间于它,只是它的值域没有值,改变的是它的指针域的指向,其指针域的地址可以由它自己带回。

带头结点的链表比不带头结点的链表处理起来更加的简单,不要考虑头指针的指向是否发生变化的问题。

时间: 2024-08-21 15:14:37

带头节点的单链表-------C语言实现的相关文章

带头节点的单链表

//带头结点的单链表 #include <iostream> #include <stdlib.h> using namespace std; typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; void InitList(LinkList *L); void Create_head(LinkList l); void Create_rear(

带头节点的单链表的插入操作

1.偶然看到了十字链表的应用,想到之前在<数据结构与算法分析>的链表一章中,需要用多重表实现一个简单的查询功能.功能需求如下: “已知 学生 和 学校课程 总数 分别为 40000 和 2500,现在需要得到两份报告,一份显示每门课成注册的所有学生信息, 一份显示每个学生注册了哪些课程.” 显然可以用一个 40000 * 2500 个元素的二维数组来解决,但是每个学生选课数目很少,因此会浪费很多空间.因此选择十字链表来实现. 既然是链表,那么肯定要有插入操作,于是便有了本文.算是对功能实现前的

带头节点控制单链表之C语言实现

//  1.头.尾节点位置 //  2.链表 //  元素数量 #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <string.h> //链表节点信息: // //   1.数据域 //   2.指针域 #define TRUE     (1) #define FALSE    (0) #define ZERO     (0) #define ONLY_ONE (1)

【 C# 数据结构】(一) -------------------------- 泛型带头节点的单链表,双向链表实现

在编程领域,数据结构与算法向来都是提升编程能力的重点.而一般常见的数据结构是链表,栈,队列,树等.事实上C#也已经封装好了这些数据结构,在头文件 System.Collections.Generic 中,直接创建并调用其成员方法就行.不过我们学习当然要知其然,亦知其所以然. 本文实现的是链表中的单链表和双向链表,并且实现了一些基本方法 一. 定义一个链表接口 MyList 接口里声明了我们要实现的方法: interface MyList<T> { int GetLength(); //获取链表

【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)

所实现的一元多项式的结构如下图所示: 若只对多项式进行"求值"等不改变多项式系数和指数的运算,采用类似顺序表的顺序存储结构即可,否则应采用链式存储结构,本文因为要进行一元多项式的加法,加法,乘法,故采用的是链式存储结构 Polynomail.h #include<stdio.h> #include<assert.h> struct Node { int coef; //系数 int expn; //指数 }; //节点结构 typedef struct Poly

前插法创建带头节点的单链表

1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct{ 4 int info; 5 struct node *next; 6 }node; 7 node* creat(){ 8 int n,i; 9 node *head; 10 head=(node*)malloc(sizeof(node)); 11 head->next=NULL; 12 printf("input creat node's num\n

线性表的链式存储结构(带头结点的单链表)

首先,我们定义带头节点的单链表存储结构如下: 1 /* 2 ** 线性表的单链表存储结构定义 */ 3 typedef int ListElemType;//线性表数据元素类型 4 typedef struct tagLNode { 5 ListElemType data; 6 struct tagLNode *next; 7 }LNode, *LinkList; 在此基础上可以执行的基本操作如下: 1 #include "linklist_algo.h" 2 #include <

带头结点的单链表

代码: /* *带头节点的单链表 */ #include<iostream> #include<stdlib.h> using namespace std; typedef struct ListNode { int data; struct ListNode* next; } Node,*PNode; //新建结点,num表示结点个数 PNode NewNode(int num) { //新建头结点 PNode head=(PNode)malloc(sizeof(Node));

对带头结点的单链表的简单操作

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define DataType int           //int 可以改写为其它数据类型 typedef struct Node { DataType data; struct Node *next; }Node,*pNode;          //定义结点结构体