当前位置:首页 » 《关注互联网》 » 正文

最好懂的C语言实现无头单向链表-新手向_燕麦冲冲冲的博客

2 人参与  2022年01月18日 11:26  分类 : 《关注互联网》  评论

点击全文阅读


目录

    • 一、易错的接口实现
      • 1.1 新节点开辟函数
      • 1.2 尾插
      • 1.3 尾删
    • 二、常见简单接口
      • 2.1 打印链表
      • 2.2 节点计数器
      • 2.3 判断是否为空链表
      • 2.4 通过值查找节点
      • 2.5 头插
      • 2.6 头删
      • 2.7 在任意节点后插入节点
      • 2.8 在任意节点后删除节点
      • 2.9 销毁链表
    • 三、头文件相关内容
      • 3.1 引用的库函数
      • 3.2 结构体声明

一、易错的接口实现

1.1 新节点开辟函数

由于创建一个新节点是频繁的操作,所以封装为一个接口最佳。

链表节点的属性有:(1)数值。(2)指向下一个节点的地址。(3)自身地址。

static SLTNode* BuySListNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	//开辟失败
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	//初始化
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

数值和next地址都由此函数初始化,自身地址则由函数的返回值返回。

要注意使用malloc函数时,可能存在开辟空间失败的情况,这时会返回NULL

1.2 尾插

尾插的难点在于存在特殊情况。

当对非空链表和空链表进行尾插时,所需代码不同。

对非空链表尾插时,算法是:找到此链表的尾部,即遍历此链表,直至自定义的结构体指针tail的下一个节点为NULL,结束遍历。在tail的后面插入一个新节点。

对空链表尾插时,算法是:直接把新节点作为链表的头节点。

void SListPushBack(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);
	//找尾
	SLTNode* tail = *pphead;
	if (tail == NULL)
	{
		tail = BuySListNode(x);
		*pphead = tail;
	}
	else
	{
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		SLTNode* newnode = BuySListNode(x);
		tail->next = newnode;
	}
}

1.3 尾删

此接口也有特殊情况处理。

当链表有一个以上的节点时,算法:遍历链表到尾部,freetail所在内存,改变tail之前一个节点的next,为NULL

需要一个结构体指针变量prev来记录tail的前一个节点。

当链表只有一个节点时,算法:tail一开始就在尾部,直接freetail,再把prev指针(初值为NULL)赋值给头节点*pphead

如果不单独考虑这种情况的话,会因为NULL->next而出现内存错误。

当链表没有节点时,是不可以调用尾删的,直接用assert函数报错。

void SListPopBack(SLTNode** pphead)
{
	assert(pphead);
	assert(*pphead);//没有节点断言报错
	SLTNode* prev = NULL;
	SLTNode* tail = *pphead;
	while (tail->next != NULL)
	{
		prev = tail;
		tail = tail->next;
	}
	free(tail);
	tail = NULL;
	if (prev != NULL)
		prev->next = NULL;
	else
		*pphead = prev;
}

二、常见简单接口

2.1 打印链表

void SListPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}

2.2 节点计数器

int SListSize(SLTNode* phead)
{
	//计数器
	int count = 0;
	SLTNode* cur = phead;
	while (cur)
	{
		count++;
		cur = cur->next;
	}
	return count;
}

2.3 判断是否为空链表

bool SListEmpty(SLTNode* phead)
{
	return phead == NULL;
}

2.4 通过值查找节点

SLTNode* SListFind(SLTNode* phead, SLTDataType data)
{
	//通过数据查找节点-遍历节点,判断值是否相等
	SLTNode* cur = phead;
	while (cur)
	{
		if (cur->data == data)
			return cur;
		cur = cur->next;
	}
	return NULL;
}

2.5 头插

void SListPushFront(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);
	SLTNode* newnode = BuySListNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

2.6 头删

void SListPopFront(SLTNode** pphead)
{
	assert(pphead);
	assert(*pphead);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = NULL;
	*pphead = next;
}

2.7 在任意节点后插入节点

void SListInsert(SLTNode* pos, SLTDataType x)
{
	assert(pos);
	SLTNode* newnode = BuySListNode(x);
	SLTNode* next = pos->next;
	pos->next = newnode;
	newnode->next = next;
}

2.8 在任意节点后删除节点

void SListErase(SLTNode* pos)
{
	assert(pos);
	assert(pos->next);
	SLTNode* next = pos->next;
	pos->next = next->next;
	free(next);
	next = NULL;
}

2.9 销毁链表

void SListDestroy(SLTNode** pphead)
{
	assert(pphead);
	SLTNode* cur, * nextnode;
	cur = *pphead;
	nextnode = NULL;
	while (cur)
	{
		nextnode = cur->next;
		free(cur);
		cur = nextnode;
	}
	*pphead = NULL;
}

三、头文件相关内容

3.1 引用的库函数

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

3.2 结构体声明

typedef int SLTDataType;//重定义可便于修改值的数据类型
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLTNode;//重定义可减少代码冗余

点击全文阅读


本文链接:http://m.zhangshiyu.com/post/33479.html

节点  链表  函数  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 远山长天青晓免费在线(乔意林景辞秦艺晚)_远山长天青晓免费在线
  • 完结文经年离歌愁未休+结局+番外列表_完结文经年离歌愁未休+结局+番外(顾允廷宋卿落)
  • 老婆骂我废物,却又求我爱她小说免费试读_「秋芙然姜言铭言铭哥」小说精彩节选推荐
  • 完结文余留空念与微风最后结局列表_完结文余留空念与微风最后结局(傅时砚许初玖)
  • 全文此去经年人未还+后续+番外(沈青禾贺临渊)列表_全文此去经年人未还+后续+番外
  • [冷战两个月后,我选择跳楼回家]最新后续章节在线阅读_柳依依宋青雪儿人物羁绊章节精选
  • 女儿有钱后却转身起诉苦命妈妈全列表_女儿有钱后却转身起诉苦命妈妈全(陈雨晴林淑芬)
  • 带女儿离婚后,偏爱白月光的父子俩后悔了章节限时抢先看‌_凤遥免费试读
  • 女儿有钱后却转身起诉苦命妈妈(陈雨晴林淑芬)全书浏览_女儿有钱后却转身起诉苦命妈妈全书浏览
  • 完结文远山长天青晓+后续+结局列表_完结文远山长天青晓+后续+结局(乔意林景辞秦艺晚)
  • 此去经年人未还全书+后续(沈青禾霍沉洲)列表_此去经年人未还全书+后续(沈青禾霍沉洲)此去经年人未还全书+后续在线
  • 桃花依然笑春风全书+后续+结局(陆乘渊云梵音)列表_桃花依然笑春风(陆乘渊云梵音)桃花依然笑春风全书+后续+结局在线

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1