链表(四)——带表头的单向链表

1.带表头的单向链表

(1)不带表头的单向链表在实现插入和删除时必须区分头结点和其他节点的处理。

(2)使用带表头的单向链表的好处:不用考虑头结点的单独处理。

表头节点:数据域没有值,指针域指向单向链表中数据域含值的第一个结点。

2.代表头的单向链表的基本操作

#include <stdio.h>
#include <malloc.h>

#define NULL	0

typedef struct node {
	int data;
	struct node *next;
}ElemSN;

ElemSN * creat_link(int ms); //创建一个带表头的链表
void print_link(ElemSN *head); //输出单向链表
void delete_node(ElemSN *head, int x); //删除结点
void insert_node(ElemSN *head, int x); //插入结点
void clear_link(ElemSN *head); //删除链表

int main()
{
	ElemSN *head;
	int ms, x;

	printf("Please input node number:");
	scanf("%d", &ms);
	head = creat_link(ms); //创建链表
	print_link(head);
	printf("Please input delete node:");
	scanf("%d", &x);
	delete_node(head, x); //删除结点
	print_link(head);
	printf("Please input insert node:");
	scanf("%d", &x);
	insert_node(head, x);
	print_link(head);
	clear_link(head);
	print_link(head);
}

ElemSN * creat_link(int ms) //带表头的单向链表除了头结点其余结点
                            //创建方法一致,所以不用逆向创建
{
	ElemSN *h = NULL, *p;
	int i, x;

	h = p = (ElemSN *)malloc(sizeof(ElemSN));
	for(i = 0; i < ms; i++)
	{
		p->next = (ElemSN *)malloc(sizeof(ElemSN)); //创建新结点
		printf("Please input node data:");
		scanf("%d", &x);
		p->next->data = x; //新结点初始化
		p->next->next = NULL; //新结点初始化
		p = p->next;
	}

	return h;
}

void print_link(ElemSN *head)
{
	if(NULL == head->next)
	{
		printf("Link is null.");
	}
	for(head=head->next; head; head = head->next)
	{
		printf("%d ", head->data);
	}
	printf("\n");
}

void delete_node(ElemSN *head, int x)
{
	ElemSN *p, *q;

	for(p=head, q=head->next; q && q->data != x; p=q, q=q->next){}
	if(q != NULL)
	{
		p->next = q->next;
		free(q);
	}
}

void insert_node(ElemSN *head, int x)
{
	ElemSN *p, *q;

	if(NULL == head)
		return;

	if(NULL == head->next) //链表为空时
	{
		head->next = (ElemSN *)malloc(sizeof(ElemSN));
		head->next->next = NULL;
		head->next->data = x;
		return;
	}

	p = head;
	q = head->next;
	if(NULL == q->next) //链表中只有一个元素时
	{
		p->next = (ElemSN *)malloc(sizeof(ElemSN));
		p->next->data = x;
		p->next->next = q;
		return;
	}

	if(q->data >= q->next->data) //递减链表
	{
		for(; q && q->data >= x; p = q, q = q->next){}
	}
	else //递增链表
	{
		for(; q && q->data <= x; p = q, q = q->next){}
	}

	if(NULL == q) //插入在链表尾部
	{
		q = (ElemSN *)malloc(sizeof(ElemSN));
		q->data = x;
		q->next = NULL;
		p->next = q;
	}
	else if(q == head->next) //插入在表首
	{
		q = (ElemSN *)malloc(sizeof(ElemSN));
		q->data = x;
		q->next = head->next;
		head->next = q;
	}
	else //插入在中间位置
	{
		p->next = (ElemSN *)malloc(sizeof(ElemSN));
		p->next->next = q;
		p->next->data = x;
	}
}

void clear_link(ElemSN *head)
{
	ElemSN *p;

	while(head->next)
	{
		p = head->next;
		head->next = p->next;
		free(p);
	}
}

时间: 2025-01-12 16:56:09

链表(四)——带表头的单向链表的相关文章

Python与数据结构[0] -&gt; 链表[0] -&gt; 单链表与带表头单链表的 Python 实现

单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利用Python来完成单链表的实现. 1 单链表 不带表头的单链表通常形式如下, node_1 -> node_2 -> node_3 -> node_4 完整代码 1 class Node: 2 def __init__(self, val=None, nxt=None): 3 self.v

链表(二):单向链表

一.什么是单向链表 在动态分配内存空间时,最常使用的就是“单向链表”(Single Linked List).一个单向链表节点基本上是由两个元素,即数据字段和指针所组成,而指针将会指向下一个元素在内存中的位置,如下图所示: 在“单向链表”中,第一个节点是“链表头指针”,指向最后一个节点的指针设为NULL,表示它是“链表尾”,不指向任何地方.例如列表A={a.b.c.d.x},其单向链表的数据结构如下图所示: 由于单向链表中所有节点都知道节点本身的下一个节点在哪里,但是对于前一个节点却没有办法知道

实现你的第一个链表——手把手教你创建单向链表

写在前面 这是我原发在独立博客上的文章,用来帮助初学链表的同学们理解链表,现在发在这里供大家批评. 为什么要使用链表? 这是我们首先要考虑的一个问题,我们之前已经学过了数组的使用,可以方便快速地存储大量数据,为何还要引入"链表"的概念呢? 比如我们让50个小朋友排排坐,那事情是很好办的:只需要准备50个椅子,让小朋友们依次坐好即可,这就是数组的使用.但是,如果我们预先不知道有多少小朋友,那事情就不好办了,我们可能需要准备大量的椅子,但这就会浪费很多空间:此外,如果一个新来的小朋友必须进

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始

数据结构与算法学习-单向链表的实现

链表(Chain本文所说链表均为单向链表,以下均简称单向链表)实际上是由节点(Node)组成的,一个链表拥有不定数量的节点.而向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的. 节点(Node)是由一个需要储存的对象及对下一个节点的引用组成的.也就是说,节点拥有两个成员:储存的对象.对下一个节点的引用. 这样说可能大家不是很明白,我贴一张图大家可能更容易理解. package LinkedList; /** * <p><strong>

单向链表和双向链表的原理及其相关实现

(一)什么是链表? 链表是线性表的一种,所谓的 线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现.而链表不是用顺序实现的,用指针实现,在内存中不连 续.意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题. 所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取.链表有很多种不同的类型:单向链表.双向链表及循环链表. 1.那么先从单向链表着手,先看看单向链表的模拟图: 单向链表包含两个域,一个是信息

C#学习单向链表和接口 IList&lt;T&gt;

作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: MSDN 索引器(C# 编程指南) <数据结构(C#语言版)>下载 When to use IEnumerable, ICollection, IList and List 章节: 单向链表元素 定义单向链表操作接口 逐步实现单向链表 正文: 前面学习了 IEnumerable<T>.IComparable<T>.ICollec

单向链表模拟

为什么出这个真理文档呢?方面以后我们的视频不断跟进,高级部分关于JDK源码的学习,所以有些基本的思维要叙述一下,包括AQS,常用数据结构,线程等等.这一个帖子主要是我以前写的模拟常用数据结构的代码,可能有些bug 并且不规范,但是重在学习思维.并没有JDK源码部分考虑多,只是简单的写了一点.分享给大家,关于线程同步器的学习我觉得先会用  然后看源码,接着模拟.好开始数据结构了. 注意:在java数据结构中模拟的话 通过数组和引用可以模拟几乎所有的结构. 链表结构的模拟 1.单向链表 a.基础结构

【转】单向链表(单链表)的Java实现

最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我 还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提