首页 > 其他分享 >单链表

单链表

时间:2025-01-18 23:54:26浏览次数:1  
标签:Node pre 单链 list next current data

单链表

alt text

alt text

alt text

/*单链表*/
#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
	int data;
	struct Node* next;
}Node;

Node* initList(){
	Node* list = (Node*)malloc(sizeof(Node));
	list -> data = 0;
	list -> next = NULL;
	return list;
}

void headList(Node* list, int data){
	Node* node = (Node*)malloc(sizeof(Node));
	node -> data = data;
	node -> next = list -> next;
	list -> next = node;
	list -> data ++;
}

void tailList(Node* list, int data){
	Node* head = list;
	Node* node = (Node*)malloc(sizeof(Node));
	node -> data = data;
	node -> next = NULL;
	list = list -> next;
	while(list -> next){
		list = list -> next;
	}
	list -> next = node;
	head -> data ++;
}

void deleList(Node* list, int data){
	Node* pre = list;
	Node* current = list -> next;
	while(current){
		if(current -> data == data){
			pre -> next = current ->next;
			free(current);
			break;//不加break为什么就死循环了
		}
		pre = current;
		current = current -> next;
	}
	list -> data --;
}
/*为什么不加break就不打印???
free 函数不会改变 current 变量本身
它只是释放了 current 指向的内存
如果 current 在 free 之后没有被重新赋值
它仍然会指向已经被释放的内存区域
这会导致未定义行为,包括潜在的死循环。
*/
void deleListAll(Node* list, int data){
    Node* pre = list;
    Node* current = list->next;
    while(current){
        if(current->data == data){
            pre->next = current->next; // 删除当前节点
            free(current);             // 释放当前节点的内存
            current = pre->next;       // 更新 current 指向下一个节点
            list->data--;              // 更新链表长度
        } else {
            pre = current;             // 更新 pre 为当前节点
            current = current->next;   // 更新 current 为下一个节点
        }
    }
}

void printList(Node* list){
	list = list -> next;
	while(list){
		printf("%d ",list -> data);
		list = list -> next;
	}
	printf("\n");
}
int main(){
	Node* list = initList();
	headList(list, 1);	
	headList(list, 2);
	headList(list, 1);
	headList(list, 4);
	headList(list, 5);
	tailList(list, 6);
	tailList(list, 7);
	tailList(list, 8);
	tailList(list, 9);
	tailList(list, 10);
	deleList(list, 9);
	deleListAll(list, 1);
	printList(list);
	return 0;
}//5 4 2 6 7 8 10

标签:Node,pre,单链,list,next,current,data
From: https://www.cnblogs.com/GJ504b/p/18679044

相关文章

  • 算法2-25 有序单链表删除重复元素(附加代码模式)
    题目描述根据一个递增的整数序列构造有序单链表,删除其中的重复元素本题是附加代码模式,主函数main和打印链表的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释附加代码。附加代码如下:void PrintList(const List &list){    Node *p = list->nex......
  • 单链表简要分析与实现(Java)
    目录线性表简述线性表两种实现方式子问题:线性表顺序存储结构与链式存储结构的比较单链表的实现1.结点类ListNode2.初始化操作3.参数异常4.头插法插入结点5.查找链表最后一个结点6.尾插法插入结点7.根据索引查找结点8.根据索引得到索引对应结点的数据9.在......
  • 数据结构——单链表(C语言版:超详细)
    目录一、引言1.数据结构的重要性2.单链表在其中的地位二、什么是单链表1.单链表的定义2.基本概念解释三、单链表的结构特点1.与数组对比的优势2.存在的劣势四、单链表的基本操作1.节点的创建2.动态申请一个节点3.插入节点3.1尾插3.2头插3.3在pos之前插入3.4在......
  • 数据结构与算法-单链表
    单链表链表的介绍既然顺序存储中的数据因为挤在一起而导致需要成片移动,那很容易想到的解决方案是将数据离散地存储在不同内存块中,然后在用来指针将它们串起来。这种朴素的思路所形成的链式线性表,就是所谓的链表。上图中,所有的节点均保存一个指针,指向其逻辑上相邻的下一......
  • 单链表的一些操作(c语言):插入头节点、尾节点、删除某个节点
    #include<stdio.h>#include<stdlib.h>structNode{  intdata;  structNode*Next;  /*data*/};typedefstructNodenode;node*Link;// 创建一个新的节点node*CreateNewNode(intdata){  node*NewNode=(node*)malloc(sizeof(node......
  • 数据结构:循环单链表
    循环单链表(CircularSinglyLinkedList)循环单链表是单链表的一种变体,其特点是链表的尾节点指向头节点,形成一个闭环。这种结构允许在链表中进行无缝的遍历,并且可以从任何节点开始遍历整个链表。循环单链表通常用于需要循环访问元素的场景,如轮询调度、环形缓冲区等。1.节点结......
  • 单链表的创建以及插入<上>
    1:此次学习参考的是b站up主【【一听就懂】C语言单链表(合集)!学完C语言还没学会写单链表吗?一节课教你有头单链表的全部知识!】https://www.bilibili.com/video/BV1Mm4y1V7Ww?vd_source=fa5bfcb2d5af224272cc17f6b40b10c3易错点2.1在 creatlist 和 creatNode 函数中,......
  • (王道练习代码仓库)单链表操作
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>typedefintElemtype;//节点定义typedefstructLNode{ Elemtypedata; structLNode*next;}LNode,*LinkList;//求链表的长度intLenthList(LinkListhead){ LNode*p=head->next;......
  • 力扣刷题:单链表OJ篇(下)
    大家好,这里是小编的博客频道小编的博客:就爱学编程很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!目录1.环形链表(1)题目描述(2)解题思路(3)复杂度分析2.环形链表2(1)题目描述(2)解题思路(3)复杂度分析快乐的时光总是短暂,咱们下篇博文再见啦......
  • C中单链表反序的实现方法是什么?
    C中单链表反序的实现方法在C语言中,单链表的反序操作可以通过多种方法实现,主要包括迭代法和递归法。以下是详细的实现步骤和示例代码。迭代法实现单链表反序迭代法是通过遍历链表,将当前节点的指针指向前一个节点,从而实现链表的逆序。具体步骤如下:「定义节点结构体」:定义一个......