用语言写单链表

#pragma once

#include<stdio.h>

#include<assert.h>

#include<malloc.h>

#include<stdlib.h>

typedef int DataType;

typedef struct Node

{

DataType _data; // 数据

struct Node* _next; // 指向下一个节点的指针

}Node, *PLinkList;

//typedef struct Node  Node;

//typedef struct Node* PLinkList;

/////////////////////////////////////////////////////////////////////////////////

// 单链表的基本操作

// 初始化/销毁/打印单链表

void InitSList(PLinkList* ppList);

void DestorySList(PLinkList* ppList);

void PrintSList(PLinkList pList);

int GetListLength(PLinkList pList);

// 尾插/尾删/头插/头删

void PushBack(PLinkList* ppList, DataType x);

void PopBack(PLinkList* ppList);

void PushFront(PLinkList* ppList, DataType x);

void PopFront(PLinkList* ppList);

// 查找/删除/插入

Node* Find(PLinkList pList, DataType x);

int Remove(PLinkList* ppList, DataType x);

void Erase(PLinkList* ppList, Node* n);

void Insert(PLinkList* ppList, Node* n, DataType x);

void InitSList(PLinkList* ppList)

{

assert(ppList);

*ppList = 0;

}

void DestorySList(PLinkList* ppList)

{

Node* begin = *ppList;

assert(ppList);

while (begin)

{

Node* tmp = begin;

begin = begin->_next;

free(tmp);

}

*ppList = 0;

}

void PrintSList(PLinkList pList)

{

Node* begin = pList;

printf("PLinkList:");

while (begin)

{

printf("->%d", begin->_data);

begin = begin->_next;

}

printf("->NULL\n");

}

int GetListLength(PLinkList ppList)

{

int length = 0;

Node* begin = ppList;

while (begin)

{

length++;

begin = begin->_next;

}

return length;

}

Node* CreateNode(DataType x)

{

Node* n = (Node*)malloc(sizeof(Node));

n->_data = x;

n->_next = 0;

return n;

}

void PushBack(PLinkList* ppList, DataType x)

{

Node* n = 0;

assert(ppList);

n = CreateNode(x);

// 没有节点/一个以上

if (*ppList == NULL)

{

*ppList = n;

}

else

{

Node* begin = *ppList;

while (begin->_next)

{

begin = begin->_next;

}

begin->_next = n;

}

}

void PopBack(PLinkList* ppList)

{

Node* begin = 0;

assert(ppList);

// 1.没有节点

if (*ppList == 0)

{

return;

}

// 2.一个节点

if ((*ppList)->_next == 0)

{

free(*ppList);

*ppList = 0;

return;

}

// 3.有两个以上的节点

begin = *ppList;

while (begin->_next->_next != NULL)

{

begin = begin->_next;

}

free(begin->_next);

begin->_next = 0;

}

void PushFront(PLinkList* ppList, DataType x)

{

Node* n = 0;

assert(ppList);

n = CreateNode(x);

// 1:没有节点 or 一个以上

if (*ppList == NULL)

{

*ppList = n;

}

else

{

n->_next = *ppList;

*ppList = n;

}

}

void PopFront(PLinkList* ppList)

{

Node* n = 0;

assert(ppList);

// 没有节点

if (*ppList == NULL)

{

return;

}

// 一个节点

if ((*ppList)->_next == NULL)

{

free(*ppList);

*ppList = NULL;

return;

}

// 两个节点以上

n = *ppList;

*ppList = n->_next;

free(n);

}

Node* Find(PLinkList ppList, DataType x)

{

Node* begin = 0;

assert(ppList);

begin = ppList;

while (begin)

{

if (begin->_data == x)

{

return begin;

}

begin = begin->_next;

}

return 0;

}

int Remove(PLinkList* ppList, DataType x)

{

Node* prev = 0;

Node* begin = 0;

Node* del = 0;

assert(ppList);

begin = *ppList;

while (begin)

{

if (begin->_data == x)

{

Node* del = begin;

// 头节点 or 中间节点

if (*ppList == begin)

{

*ppList = (*ppList)->_next;

}

else

{

prev->_next = begin->_next;

}

free(del);

return 0;

}

prev = begin;

begin = begin->_next;

}

return -1;

}

void Insert(PLinkList* ppList, Node* n, DataType x)

{

Node* tmp = 0;

assert(ppList);

tmp = CreateNode(x);

// 没有节点 / 一个以上节点

if (*ppList == NULL)

{

*ppList = tmp;

}

else

{

assert(n);

tmp->_next = n->_next;

n->_next = tmp;

}

}

void Erase(PLinkList* ppList, Node* n)

{

Node* del = 0;

assert(ppList);

assert(n);

// 处理尾节点的情况

if (n->_next == 0)

{

PopBack(ppList);

return;

}

// 将n的下一个next节点的值赋值给n, 删除n的next节点。

n->_data = n->_next->_data;

del = n->_next;

n->_next = n->_next->_next;

free(del);

时间: 2025-01-12 03:07:33

用语言写单链表的相关文章

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这时候加上一篇. 在此之前,我们先谈一下我要说的一些基本知识: ①函数参数为什么是双指针? 我们先写一下这么一个程序: # include<stdio.h>void Gai(int m){ m=5;}int main(void){ int a=1; Gai(a); printf("%d\n&

C语言实现单链表-03版

在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4,一个专门遍历数据的功能: Solution 我们的数据结构体定义如下,和上一个版本稍微有所不同: 例如,我们把人这个结构体添加一个name域,前几个版本没有名字的节点: 我们叫起来很尴尬,都是第几个第几个节点,好啦!现在有名字啦! #include <stdio.h> #include <s

C语言实现单链表-02版

我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1,要是数据很多怎么办,100000个节点,这个main函数得写多长啊... 2,这个连接的方式也太土啦吧!万一某个节点忘记连接下一个怎么办... 3,要是我想知道这个节点到底有多长,难道每次都要从头到尾数一遍嘛... 4,要是我想在尾部添加一个节点,是不是爬也要爬到尾部去啊... 这个是简单版中提出

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

C语言实现单链表的节点插入(带头结点)

我在之前一篇博客<C语言实现单链表(不带头结点)节点的插入>中具体实现了怎样在一个不带头结点的单链表中进行节点的插入.可是在实际应用中,带头结点的链表更为经常使用.更为方便.今天我们就要来使用带头结点的单链表进行节点的插入.演示样例代码上传至 https://github.com/chenyufeng1991/InsertList_HeadNode  . 核心代码例如以下: Node *InsertNode(Node *pNode,int pos,int x){ int i = 0; Node

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客<C语言实现单链表(不带头结点)的基本操作>中具体实现了不带头结点的单链表的11种操作:如计算链表长度.初始化.创建链表.清空链表等等.但是在实际使用中,带头结点的单链表往往比不带头结点的单链表用的更多,使用也更为方便.因为不用单独考虑第一个节点的情况了,第一个节点和其他后续节点的处理全都一样了,简化操作.这篇博客将会来实现带头结点的单链表的11种操作.代码上传至: https://github.com/chenyufeng1991/LinkedList_HeadNode  .

一起talk C栗子吧(第十三回:C语言实例--单链表二)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是链表以及单链表顺序储存方式的例子,这一回咱们继续说单链表的例子,不 过这一回咱们说的是:单链表链式存储. 看官们单链表的链式存储,咱们在上一回已经说过,这里就不再多说了.这一回主要举例子,通过例子来 说明什么是单链表的链式存储. 通过对比单链表的顺序储存和链式存储,可以看出来. 顺序存储链表的优点:遍历链表方便,查找也方便. 顺序存

一起talk C栗子吧(第十二回:C语言实例--单链表一)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们没有说具体的例子,而且是说了例子中的文件组织结构.这一回咱们继续说C例子, 说的例子是链表,更准确的说法叫作单链表.咱们不但要说C例子,而且会在例子中使用上一回中说过的 文件组织结构,就当作是举例说明文件组织结构的使用方法. 有点一石二鸟的感觉,哈哈. 链表定义 看官们,所谓的链表其实就是一组元素通过一定的方式链接在一起.比如我们坐的火车

C语言实现单链表

单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难抓住重点,反正我初学的时候就是看不懂: 因此我打算从简单入手去演示: 我们需要实现下面图这样的结构,叫做链表哈: Solution 首先咱们要想到这几个ABC圆圈可以代表一个数据的节点,什么是节点呢?: 节点就好比是几个同学聚集到一个宿舍一样,他们各自有各自的身高体重: 因此,我们需要一个结构体,声