带头节点的单链表-------C语言实现
/*****************************************************
Author:Simon_Kly Version:0.1 Date:20170520
Description:带头接点的单链表
Mail:degaullekong@gmail.com
Funcion List:
*****************************************************/ #include <stdio.h>
#include <stdlib.h> typedef struct node
{
int data;
struct node *next;
}Node, *Link; /*判断malloc是否正确执行*/
void is_malloc_ok(Link head)
{
if (head == NULL)
{
printf("malloc error!\n");
exit(-);
}
} /*建立链表*/
void create_link(Link * head)
{
*head = (Link)malloc(sizeof(Node));
is_malloc_ok(*head);
(*head)->next = NULL;
} /*创建节点*/
void create_node(Link * new_node)
{
*new_node = (Link)malloc(sizeof(Node));
is_malloc_ok(*new_node);
} /*插入节点尾插*/
void insert_node_tail(Link head, Link new_node)
{
Link p = NULL; p = head; while (p->next != NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
} /*插入节点头插*/
void insert_node_head(Link head, Link new_node)
{
Link p = NULL; p = head; new_node->next = head->next;
head->next = new_node;
} /*打印节点*/
void output_link(Link head)
{
Link p = NULL; if (head == NULL)
{//空链
printf("link is empty!\n");
return ;
} p = head->next;
while (p != NULL)
{
printf("%d\n", p->data);
p = p->next;
}
} /*置空链*/
void make_empty_link(Link *head)
{
Link p = NULL; p = (*head)->next; while ((*head)->next != NULL)
{
(*head)->next = (*head)->next->next;
free(p);
p = (*head)->next;
}
} /*释放链表*/
void release_link(Link * head)
{
make_empty_link(head);
free(*head);
*head = NULL;
} int main()
{
int i; Link head = NULL;
Link new_node = NULL; create_link(&head); /*尾插*/
for (i = ; i < ; i++)
{
create_node(&new_node);
new_node->data = i + ;
insert_node_tail(head, new_node);
}
output_link(head); /*头插*/
create_node(&new_node);
new_node->data = ;
insert_node_head(head, new_node);
output_link(head); /*释放链表阶段*/
release_link(&head);
output_link(head);
return ;
}
不带头结点代码传送门:http://www.cnblogs.com/SimonKly/p/6890287.html
可以从代码中看出,不带头结点的代码中插入节点的函数insert*中的参数是二级指针,因为头指针的指向可能会发生变化,需要用二级指针带回一级指针的地址。
而在带头结点的代码中在相同的插入节点的函数insert*中的参数是一级指针并没有使用二级指针,因为带头结点的链表中头结点是真真实实存在,在create*中分配空间于它,只是它的值域没有值,改变的是它的指针域的指向,其指针域的地址可以由它自己带回。
带头结点的链表比不带头结点的链表处理起来更加的简单,不要考虑头指针的指向是否发生变化的问题。
带头节点的单链表-------C语言实现的更多相关文章
- 不带头结点的单链表------C语言实现
File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...
- 【 C# 】(一) ------------- 泛型带头节点的单链表,双向链表实现
在编程领域,数据结构与算法向来都是提升编程能力的重点.而一般常见的数据结构是链表,栈,队列,树等.事实上C#也已经封装好了这些数据结构,在头文件 System.Collections.Generic ...
- c语言实现--不带头结点的单链表操作
1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...
- 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。
有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...
- java编写带头结点的单链表
最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...
- 单链表 C语言 学习记录
概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...
- C/C++中创建(带头结点、不带头结点的)单链表
1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ...
- 链表习题(2)-一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点。
/*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍 ...
随机推荐
- AcWing 207. 球形空间产生器 (高斯消元)打卡
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体. 现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. ...
- websocket 文件上传
<template> <div class="pad20"> <input id="file" ref="f ...
- AndroidManifest.xml配置文件详解(转)
转载博客:http://blog.csdn.net/shagoo/article/details/7485958# AndroidManifest.xml配置文件对于Android应用开发来说是非常重 ...
- apache的tomcat负载均衡和集群配置 "
略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务 ...
- PAT 1036 Boys vs Girls (25 分)
1036 Boys vs Girls (25 分) This time you are asked to tell the difference between the lowest grade ...
- JQuery Mobile 图片布局
JQuery Mobile 图片布局 1.实现效果
- Linux中的特殊权限s、t、i、a
文件权限除了r.w.x外还有s.t.i.a权限:s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行.在设置s权限时文件属主.属组必须先设置相应的x权限,否则s权限并不能 ...
- eclispse指针变成十字型
按ATL+Shift+A可以十字和箭头切换.
- Git与GitHub同步
如何通过Git Bash实现本地与远端仓库——GitHub的同步 1.下载安装Git:下载网址 2.在自己的github上新建一个repository 例如我这里新建了一个叫test的reposito ...
- Spring 源码学习——Aop
Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...