首页 > 其他分享 >[学习记录]带头指针的单向链表的基本功能

[学习记录]带头指针的单向链表的基本功能

时间:2024-03-18 22:33:17浏览次数:21  
标签:LinkNode void next 链表 基本功能 printf data ptr 指针

效果

代码


#include "stdio.h"
#include "stdlib.h"

typedef struct linknode {
	int data;
	struct linknode* next;
}LinkNode;

LinkNode* CreateHeadNode(void);//创建头结点
void CreateNewNode(LinkNode* H);//创捷节点
void PrintList(LinkNode* H);//打印链表
void DeleteNode(LinkNode* H, int data);//删除节点
void ReverseList(LinkNode* H);//反转链表
void function(LinkNode* H, int func);//功能汇总函数

int main()
{
	LinkNode* H = CreateHeadNode();
	int func;
	while (1)
	{
		printf("Select function: ");
		scanf_s("%d", &func);
		function(H, func);
		printf("\n");
	}
	return 0;
}

LinkNode* CreateHeadNode(void)
{
	LinkNode* Head = (LinkNode*)malloc(sizeof(LinkNode));
	//Head->num = 0;
	Head->data = 0;
	Head->next = NULL;
	return Head;
}

void CreateNewNode(LinkNode* H)
{
	int data;
	LinkNode* ptr = (LinkNode*)malloc(sizeof(LinkNode));
	ptr->next = H->next;
	H->next = ptr;
	scanf_s("%d", &data);
	ptr->data = data;
	H->data++;
}

void PrintList(LinkNode* H)
{
	LinkNode* ptr = H->next;
	printf("List:	");
	while (ptr != NULL)
	{
		printf("%d\t", ptr->data);
		ptr = ptr->next;
	}
	printf("\n");
}

void DeleteNode(LinkNode* H, int data)
{
	LinkNode* ptr = H->next;
	LinkNode* ptr_last = H;
	while (ptr != NULL && ptr->data != data)//先判空,否则会造成溢出
	{
		ptr_last = ptr;
		ptr = ptr->next;
	}
	if (ptr != NULL && ptr->data == data)//上述两个条件有一个不符合就会进入if判断,所以此处仍要对两个条件判断
	{
		ptr_last->next = ptr->next;
		free(ptr);
		printf("delete successed\n");
	}
	else
		printf("delete failed\n");
}

void ReverseList(LinkNode* H)
{
	LinkNode* ptr = H->next;
	LinkNode* ptr_last = NULL;
	H->next = NULL;
	while (ptr != NULL)
	{
		ptr_last = ptr;
		ptr = ptr->next;
		ptr_last->next = H->next;
		H->next = ptr_last;
	}
}

void function(LinkNode* H, int func)
{
	switch (func)
	{
	case 1:
		printf("ADD\n");
		printf("data: ");
		CreateNewNode(H);
		break;
	case 2:
		printf("DEL\n");
		printf("data: ");
		int data;
		scanf_s("%d", &data);
		DeleteNode(H, data);
		break;
	case 3:
		printf("PRT\n");
		PrintList(H);
		break;
	case 4:
		printf("REV\n");
		ReverseList(H);
		break;
	default:
		printf("ERR\n");
		break;
	}

}

标签:LinkNode,void,next,链表,基本功能,printf,data,ptr,指针
From: https://blog.csdn.net/yuzexuan666/article/details/136824114

相关文章

  • C语言数据结构链表(无头结点)功能实现(增,删,改,查)
    #include<stdio.h>#include<stdlib.h>typedefstructLNode{   int data;   struct   LNode*next;}LNode,*LinkList; boolInitList(LinkList&L){    L=NULL;    return0; }boolinsert(LinkList&L,inti,intx){       ......
  • 深入C语言指针,使代码更加灵活(三)
    一、函数指针1.1函数的地址在讲解函数指针变量之前,我们先思考一下什么是函数指针变量,我们可以同数组指针变量进行类比:数组指针—是指针—是存放指向数组的指针,是存放数组地址的指针;函数指针—是指针—是存放指向函数的指针,是存放函数地址的指针;数组是有地址的,那么函数......
  • L2-022 重排链表
    这道题真的烦,输出想半天。反正就是要区分奇偶,才能知道那个结点最后要打印出-1.我看网上遇到的都是测试点3的问题,不过我有问题的是测试点1,前三个出问题就是节点数奇偶的问题。#include<bits/stdc++.h>usingnamespacestd;map<int,pair<int,int>>mp;intmain(){ ints......
  • P1712 [NOI2016] 区间 线段树+双指针
    //Problem://P1712[NOI2016]区间////Contest:Luogu//URL:https://www.luogu.com.cn/problem/P1712//MemoryLimit:250MB//TimeLimit:1000ms////PoweredbyCPEditor(https://cpeditor.org)#include<iostream>#include<algorithm......
  • 深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】
    一.数组指针变量1.什么是数组指针变量?说到数组指针,那必然要说一下指针数组,指针数组是什么呢?指针数组是一种数组,只不过这种数组存放的是地址(指针)。那把这两个词反过来,数组指针是什么?它是指针变量,还是数组?答案是:指针变量。这个指针有些特殊,它存放的是数组的地址,它是能够指向数......
  • Go01-开发环境搭建+注释+基本数据类型+指针+命名规范
    Go01-开发环境搭建+注释+基本数据类型+指针+命名规范1.Go常用网站https://www.topgoer.com/,Go学习网站,包含Go基础教程、beego、lris等Go开发常用框架。Go开发软件下载:https://code.visualstudio.com/,VSCode;https://www.jetbrains.com/zh-cn/go/,GOLand。https://studygolang.c......
  • C语言动态链表练习(简单易懂)
    学习目标:初步认识动态链表,并会最基础的应用。题目内容:写个程序,输入a,b,c如果a>b,a=a➖b    b>c,b=b➖c    c>a,c=c➖a要求:开始时输入k➕1行数,第一行为k,代表数的组数,下面每一行为一个组,每组四个数,前三个为a,b,c,最后一个为这组数进行上述计算的次数题目特点分析:开始......
  • 反转链表
    描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。数据范围:0≤n≤1000要求:空间复杂度O(1),时间复杂度O(n),如当输入链表{1,2,3}时,经反转,原链表变为{3,2,1},所以对应输出为{3,2,1}.以上转换过程如下图所示:实......
  • C语言指针完整总结!!!
    1.指针介绍1.简介:C语⾔中给地址起了新的名字叫:指针。一个内存单元是一字节内存单元的编号==地址==指针在x86的环境中,一共有32根地址总线,即32个比特位。一个字节有八个比特位,而⼀个比特位可以存储⼀个2进制的位1或者0,因此32根地址线,就能表示2^32种含义,每⼀种含义都......
  • [Java·算法·中等] LeetCode21. 合并两个有序链表
    人不走空                                          ......