3、蛤蟆的数据结构笔记之三线性表单项链表实现

今天励志短语:“人生的价值,即以其人对于当代所做的工作为尺度。”

昨天我们看了线性表的一些定义概念,今天来看下其中的单项链表代码如何实现。

1.  声明结构

如下声明一个指向结构的指针。(存放整数的节点,我们也可以根据需要创建字符的链表)

typedef
struct
list_node *list_pointer;

typedef
struct
list_node{

intdata;

list_pointerlink;

};

list_pointerptr =
NULL;

2.  定义宏

定义一个宏,来检测空表

#define
IS_EMPTY(ptr)    (!(ptr))

定义宏,检查是否有可用空间。

#define
IS_FULL(ptr)  (!(ptr))

3.  创建二节点的函数

函数如下,创建两个节点first和second.

First指向第一个节点,second指向第二个节点。同时第一个节点中的link指向第二个节点。

而第二个节点的link为NULL。

list_pointer create2()

{

list_pointerfirst,second;

first= (list_pointer) malloc (sizeof(list_node));

second= (list_pointer) malloc (sizeof(list_node));

second->link=
NULL;

second->data= 2;

first->data=1;

first->link=second;

returnfirst;

}

4.  表的前端插入

在表中前端插入一个值为dat的节点,实现如下。考虑了首节点是否为空的情况。

void insert(list_pointer *ptr,
int
dat)

{

list_pointertemp;

temp =(list_pointer)malloc(sizeof(list_node));

if(
IS_FULL(temp)){

fprintf(stderr,"Thememory is full\n");

exit(1);

}

temp->data=dat;

if(*ptr){

temp->link=*ptr;

*ptr=temp;

}

else{

temp->link=NULL;

*ptr=temp;

}

}

5.  节点的删除

删除节点需要3个输入,一个是链表的起始,一个是删除点的前驱节点,另一个是删除的节点本身。要判断链表是否为空,为空就不能再free了。

如果删除的是首节点,那么首节点的前驱节点一定是NULL,那么直接将trail指向下一个即可。

void deletenode(list_pointer *ptr,list_pointer
trail,list_pointer
node)

{

if(IS_EMPTY(ptr))

{

fprintf(stderr,"emptylist ");

exit(1);

}

if(trail)

trail->link=
node->link;

else

*ptr=(*ptr)->link;

free(node);

}

6.  表的输出

查看链表上有多少节点,输出节点中的数字。

void print_list(list_pointer
ptr)

{

printf("Thelist contains:");

for(;ptr;ptr=ptr->link)

printf("%4d",ptr->data);

printf("\n");

}

7.  表的释放

我们必须保持释放的习惯。不然会吃亏的。

void free_list(list_pointer
ptr)

{

list_pointertemp =
NULL;

for(;ptr;)

{

temp=ptr;

ptr=ptr->link;

temp->link=NULL;

free(temp);

}

}

8.  综合

执行如下代码后

void main()

{

ptr=create2();

print_list(ptr);

printf("afterinsert \n");

insert(&ptr,3);

print_list(ptr);

free_list(ptr);

}

如下图1:

删除头结点,代码如下,

如下图2

ptr=create2();

print_list(ptr);

printf("afterinsert \n");

insert(&ptr,3);

print_list(ptr);

deletenode(&ptr,NULL,ptr);

printf("afterdelete first node \n");

print_list(ptr);

free_list(ptr);

删除非头结点,代码

//删除非头结点

ptr=create2();

print_list(ptr);

printf("afterinsert \n");

insert(&ptr,3);

print_list(ptr);

deletenode(&ptr,ptr,ptr->link);

printf("afterdelete no first node \n");

print_list(ptr);

free_list(ptr);

得到如下图3.

9.  全部源码

为方便大家调试,这里附上全部代码,可直接编译运行。(蛤蟆在VS2012和 Linux GCC4.47编译均可正常运行)

#include
"stdio.h"

#include
"stdlib.h"

#define
IS_EMPTY(ptr)(!(ptr))

#define
IS_FULL(ptr)  (!(ptr))

typedef
struct list_node *list_pointer;

typedef
struct list_node{

int  data;

list_pointerlink;

}list_node;

//建立空表ptr

list_pointer ptr =
NULL;

void insert(list_pointer *ptr,
int
dat)

{

list_pointertemp;

temp =(list_pointer)malloc(sizeof(list_node));

if(
IS_FULL(temp)){

fprintf(stderr,"Thememory is full\n");

exit(1);

}

temp->data=dat;

if(*ptr){

temp->link=*ptr;

*ptr=temp;

}

else{

temp->link=NULL;

*ptr=temp;

}

}

void deletenode(list_pointer *ptr,list_pointer
trail,list_pointer
node)

{

if(IS_EMPTY(ptr))

{

fprintf(stderr,"emptylist ");

exit(1);

}

if(trail)

trail->link=
node->link;

else

*ptr=(*ptr)->link;

free(node);

}

void print_list(list_pointer
ptr)

{

printf("Thelist contains:");

for(;ptr;ptr=ptr->link)

printf("%4d",ptr->data);

printf("\n");

}

void free_list(list_pointer
ptr)

{

list_pointertemp =
NULL;

for(;ptr;)

{

temp=ptr;

ptr=ptr->link;

temp->link=NULL;

free(temp);

}

}

list_pointer create2()

{

list_pointerfirst,second;

first= (list_pointer) malloc (sizeof(list_node));

second= (list_pointer) malloc (sizeof(list_node));

second->link=
NULL;

second->data= 2;

first->data=1;

first->link=second;

returnfirst;

}

void main()

{

//基本运行

/*      ptr=create2();

print_list(ptr);

printf("afterinsert \n");

insert(&ptr,3);

print_list(ptr);

free_list(ptr);*/

//删除头结点

ptr=create2();

print_list(ptr);

printf("afterinsert \n");

insert(&ptr,3);

print_list(ptr);

deletenode(&ptr,NULL,ptr);

printf("afterdelete first node \n");

print_list(ptr);

free_list(ptr);

//删除非头结点

/*      ptr=create2();

print_list(ptr);

printf("afterinsert \n");

insert(&ptr,3);

print_list(ptr);

deletenode(&ptr,ptr,ptr->link);

printf("afterdelete no first node \n");

print_list(ptr);

free_list(ptr);

*/

}

时间: 2024-08-04 00:43:34

3、蛤蟆的数据结构笔记之三线性表单项链表实现的相关文章

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1:

37. 蛤蟆的数据结构笔记之三十七图的概念

37. 蛤蟆的数据结构笔记之三十七图的概念 本篇名言:"宿命论是那些缺乏意志力的弱者的借口.--罗曼? 罗兰" 又到了一个新概念,这次咱们来看 这个图,图一看给人一种凌乱的感觉.那么它在数据结构中又是什么呢? 欢迎转载,转载请标明出处: 1.  图的概念 图(graph)是一种比线性表.树更为复杂的数据结构.在线性表中,数据元素之间呈线性关系,即每个元素只有一个直接前驱和一个直接后继.在树型结构中,数据元素之间有明显的的层次关系,即每个结点只有一个直接前驱,但可有多个直接后继,而在图结

34. 蛤蟆的数据结构笔记之三十四树的概念

34. 蛤蟆的数据结构笔记之三十四树的概念 本篇名言:"过去属于死神,未来属于你自己.--雪莱" 本篇笔记开始我们要进入新的概念了,树!是不是有点小激动呢?让我们从概念开始吧 当然概念要理解,如果当前不能立刻理解,可以后续结合代码一起理解效果更佳. 1.  树型结构 之前我们学习的那么多,其实都是线性数据结构. 树 则不同,它是非线性结构. 树形结构指的是数据元素之间存在着"一对多"的树形关系的数据结构,是一类重要的非线性数据结构.在树形结构中,树根结点没有前驱结点

30. 蛤蟆的数据结构笔记之三十数组之厄拉多塞筛

30. 蛤蟆的数据结构笔记之三十数组之厄拉多塞筛 本篇名言:"勤劳远比黄金可贵. -- 萨迪" 欢迎转载,转载请标明出处: 1.  厄拉多塞 厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数:第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数:现在既未画圈又没有被划去的第一个数是5,将它画圈,并划去5的其他倍数--依次类推,一直到所有小于或等于N的各数都画了圈或划去为止.这时,表

35. 蛤蟆的数据结构笔记之三十五遍历二叉树

35. 蛤蟆的数据结构笔记之三十五遍历二叉树 本篇名言:"冬天已经到来,春天还会远吗? --雪莱" 我们来看徐璈如何遍历二叉树. 欢迎转载,转载请标明出处: 1.  二叉树遍历 二叉树的遍历有三种方式,如下: (1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树.简记根-左-右. (2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树.简记左-根-右. (3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点.简记左-右-根. 2.

数据结构笔记之线性表

线性表即链表,基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他么个数据元素都有一个前驱和后继.是最基本且最常用的一种线性结构. 2.1线性表的定义和特点 由n(n>=0)个数据特性相同的元素否城的有限序列成为线性表,n为线性表长度,当n=0称空表. 举例:1.26个英文字母的字母表是一个线性表,数据元素是单个字母. 2.学生信息表中,每一个学生为一个数据元素,包括学号.姓名.性别等等数据项. 2.2案例:图书信息管理系统. 2.3线性表的类型定义 线性表是一个相当灵活的数据结构

数据结构 笔记2 线性表

线性表是最简单,最常用的一种数据结构,它是由n个数据元素(结点)组成的有限序列. 线性表的基本运算 1.置空表 InitList(L) ,构造一个空的线性表L 2.求表长 ListLength(L) ,返回线性表L中元素个数,即表长. 3.取表中第i个元素GetNode(L,i) ,若1 <= i <= ListLength(L) ,则返回第i个元素a[i] 4.按值查找LocateNode(L,x),在表L中查找第一个值为x的元素,并返回该元素在表L中的位置,若表中没有元素的值为x,则返回0

读书笔记:线性表-单向链表

链表(linklist) 单项链表可以说是数据结构里面最简单的部分,也是十分重要的部分,数据结构后面的学习中 比如说:栈,队列,树, 图 都要使用这种数据结构来表示. 不多说,进入我对链表的理解部分. 简介: 链表是一种数据结构,链表中,数据对象实例的每一个元素都用一个单元或节点来描述.每一个节点中都包含着它的数据[数据部分]和相关节点的位置信息[链接部分],我们称连通两个节点的部分为链(link)或指针(pointer).链表的第一个节点称为头节点(head),最后一个节点为尾节点.头节点没有

2、蛤蟆的数据结构笔记之二线性表

2.蛤蟆的数据结构笔记之二线性表 到了笔记二了,每个笔记开头都应该弄个语句激励一下自己和小伙伴. "人生中最重要的不是位置,而是前进的方向" 这次咱们学习表,没错是表.什么表?额,汉字真是博大精深,没错,只是个表.不要想歪了. 欢迎转载,转载请标明出处: 1.  定义 线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表