共享链表示例

#共享链表的应用小实例

前言:
1
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每
个节点里存到下一个节点的指针(Pointer)。由于不必按顺序存储,链表在插入的时候可以达到O⑴的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O⑴。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接(links)。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链#表,双向链表以及循环链表。
2
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。

本章知识点【共享链表实例】

#include <stdio.h>
#include <string.h>
#include"list.h"


#define STU_NUM		10

struct student{
	struct list_head node;
	int age;
	int hight;
	int code;
	char name;
};

int main(void)
{
	struct list_head head;
	struct student ming, *tmp;
	struct student *pstu;
	int i;

	/*申请10个student结构体,并赋值*/
	pstu = malloc(sizeof(*pstu)*STU_NUM);
	if(!pstu)
		return -1;
	memset(pstu, 0, sizeof(*pstu)*STU_NUM);
	for(i=0; i<STU_NUM; i++){		//赋值操作
		pstu[i].age = 20+i;
		pstu[i].hight = 160+i;
		pstu[i].name = 'a'+i;
	}
	

	/* the operations of shared list
	  * @链表操作方法,例如:链表添加、删除、查找...
	  * list.h为我们提供了统一的接口,简单、方便、稳定
	  * 我们要对接口熟练掌握,具体操作如下:
	  */
	/*初始化链表头*/
	INIT_LIST_HEAD(&head);

	/*添加节点到共享链表*/
	for(i=0; i<STU_NUM; i++)
		list_add(&pstu[i].node, &head);

	/*从共享链表删除节点*/
	list_del(&pstu[5].node);

	/*节点替换*/
	ming.age = 18;
	ming.hight = 180;
	ming.name = 'm';
	ming.code = 110;
	list_replace(&pstu[4].node, &ming.node);

	/*遍历每个节点*/
	list_for_each_entry(tmp, &head, node)
		printf(" the name is %c\n the age is %d\n the hight is %d\n the code is %d\n\n",
				tmp->name, tmp->age, tmp->hight, tmp->code);
	return 0;
}


扩展
1
根据情况,也可以自己设计链表的其它扩展。但是一般不会在边上附加数据,因为链表的点和边基本上是一一对应的(除了第一个或者最后一个节点,但是也不会产生特殊情况)。不过有一个特例是如果链表支持在链表的一段中把前和后指针反向,反向标记加在边上可能会更方便。

对于非线性的链表,可以参见相关的其他数据结构,例如树、图。另外有一种基于多个线性链表的数据结构:跳表,插入、删除和查找等基本操作的速度可以达到O(nlogn),和平衡二叉树一样。

其中存储数据元素信息的域称作数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)。指针域中存储的信息又称做指针或链。

由分别表示,,…,的N 个结点依次相链构成的链表,称为线性表的链式存储表示,由于此类链表的每个结点中只包含一个指针域,故又称单链表或线性链表。

2
一.线性链表的存储结构

二、循环链表的存储结构
循环链表是加一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点。

循环链表的操作和线性链表基本一致,差别仅在于算法中的循环条件不是p或p->next是否为空,而是它们是否等于头指针。

三、双向链表的存储结构

提问:单向链表的缺点是什么?
提示:如何寻找结点的直接前趋。
双向链表可以克服单链表的单向性的缺点。
在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前趋。
1、线性表的双向链表存储结构
typedef struct DulNode
{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}DulNode,*DuLinkList;
对指向双向链表任一结点的指针d,有下面的关系:
d->next->priou=d->priou->next=d
即:当前结点后继的前趋是自身,当前结点前趋的后继也是自身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值