单链表的一些个人易错的问题(有理解不正确的地方请大佬指正)

news2024/11/25 12:27:19

请看下列代码

代码1:(正确示范)

#include<stdio.h>
#include<stdlib.h>
struct node
{
	int data;
	struct node *next;
 };
int main()
{
	int n;
	int a;
	printf("请输入数字个数:");
	scanf("%d",&n);
	struct node *head,*tail,*p,*num;
	p=(struct node*)malloc(sizeof(struct node));
	head=p;
	tail=p;
	head->next=NULL;
	
	printf("请输入已有数字:");
	for(int i=0;i<n;i++)
	{
		p=(struct node*)malloc(sizeof(struct node));
		scanf("%d",&p->data);
		
		tail->next=p;
		tail=p;
		tail->next=NULL;
	 } 
	 printf("输出单链表元素:");
	p=head->next;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	return 0;
}

代码2:(错误示范)


#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int data;
	struct node *next;
 }node,*LinkList;

void suibian(LinkList &L)
{
	struct node *t;
	t=L->next;
		while(t!=NULL)
	{
		printf("%d ",t->data);
		t=t->next;
	}
}

int main()
{
	int n;
	int a;
	LinkList L;
	printf("请输入数字个数:");
	scanf("%d",&n);
	struct node *head,*tail,*p,*num;
	p=(struct node*)malloc(sizeof(struct node));
	head=p;
	tail=p;
	head->next=NULL;
	
	printf("请输入已有数字:");
	for(int i=0;i<n;i++)
	{
		p=(struct node*)malloc(sizeof(struct node));
		scanf("%d",&p->data);
		
		tail->next=p;
		tail=p;
		tail->next=NULL;
	 } 
	 printf("输出单链表元素:");
	 suibian(L);
	return 0;
}

OMG!!!!!你怎么会犯这种错误,你是不动脑子地copy过来的吗,说实话我当时确实是不想思考,简简单单当个摆烂人copy一下不香吗?咳咳,言归正传,我当时主要是对指针还是模糊的,似懂非懂的犯下这可笑的问题。

问题:插入的元素与链表L的关系 可以说是毫不相关啊,哥们这是定义了一个链表head啊

修改版本:


#include<stdio.h>
#include<stdlib.h>
struct node
{
	int data;
	struct node *next;
 }node,*LinkList;

void suibian(struct node *head)
{
	struct node *t;
	t=head->next;
		while(t!=NULL)
	{
		printf("%d ",t->data);
		t=t->next;
	}
}

int main()
{
	int n;
	int a;
	printf("请输入数字个数:");
	scanf("%d",&n);
	struct node *head,*tail,*p,*num;
	p=(struct node*)malloc(sizeof(struct node));
	head=p;
	tail=p;
	head->next=NULL;
	
	printf("请输入已有数字:");
	for(int i=0;i<n;i++)
	{
		p=(struct node*)malloc(sizeof(struct node));
		scanf("%d",&p->data);
		
		tail->next=p;
		tail=p;
		tail->next=NULL;
	 } 
	 printf("输出单链表元素:");
	 suibian(head);
	return 0;
}

 代码3.(正确示范)

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode{
	ElemType data;
	struct Lnode *next; 
}Lnode,*LinkList;

int main()
{
	LinkList L;
	L=(struct Lnode*)malloc(sizeof(struct Lnode));
	struct Lnode *tail, *p;
	p=L;
	tail=L;
	L->next=NULL;
	int n;
	printf("元素个数:");
	scanf("%d",&n);
	printf("请输入元素:");
	for(int i=0;i<n;i++)
	{
		L=(struct Lnode*)malloc(sizeof(struct Lnode));
		scanf("%d",&L->data);
		tail->next=L;
		printf("%d ",tail->next->data);
		tail=L;
		tail->next=NULL; 
	
	 } 
	 printf("输出元素");
	 while(p->next!=NULL)
	 {
	 	printf("%d",p->next->data);
	 	p=p->next;
	 }
	 return 0;
 } 

代码4.(错误代码)

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode{
	ElemType data;
	struct Lnode *next; 
}Lnode,*LinkList;

int main()
{
	LinkList L;
	L=(struct Lnode*)malloc(sizeof(struct Lnode));
	struct Lnode *tail, *p;
	tail=L;
	L->next=NULL;
	int n;
	printf("元素个数:");
	scanf("%d",&n);
	printf("请输入元素:");
	for(int i=0;i<n;i++)
	{
		L=(struct Lnode*)malloc(sizeof(struct Lnode));
		scanf("%d",&L->data);
		tail->next=L;
		printf("%d ",tail->next->data);
		tail=L;
		tail->next=NULL; 
	
	 } 
	 printf("\n");
	 printf("输出元素");
	 p=L;
	 while(p->next!=NULL)
	 {
	 	printf("%d",p->next->data);
	 	p=p->next;
	 }
	 return 0;
 } 

唉,兄弟,此时的L已经不是彼时的L了啊,啊?你问我为什么函数传L的时候是头结点 ,那个是系统默认在函数中使用链表L时指向它的头节点啊,哥们细心一点吧

问题:输出遍历起始位置不正确

在单链表中对指针的理解(引入第二个代码的修改版本吧,看的更直观一点)

简而言之就是,带*,&符号加变量的,指的是变量的内容(当然,一开始定义的类型得为指针类型),不带这两符号的就是取的地址,值得注意的是,运用结构体中的指针时需要使用->符号

在主函数中使用函数suibian时只需要传入地址就好即suibian(head);

一次的c语言程序作业,个人认为是一个比较好的模板,自己实力蒟蒻,大佬勿喷


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

typedef int ElemType;
typedef struct Lnode {
    ElemType data;
    struct Lnode *next;
} Lnode, *LinkList;

int num = 0; // 统计链表中有多少个元素

void createlist(LinkList *L) {
    int n;
    struct Lnode *tail, *p;
    *L = (struct Lnode *)malloc(sizeof(struct Lnode));
    if (*L == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    tail = *L;
    tail->next = NULL;
    printf("请输入链表元素(以0标志结束输入):");
    while (1) {
        scanf("%d", &n);
        if (n == 0) break;
        p = (struct Lnode *)malloc(sizeof(struct Lnode));
        if (p == NULL) {
            printf("Memory allocation failed!\n");
            exit(1);
        }
        p->data = n;
        tail->next = p;
        tail = p;
        tail->next = NULL;
        num++;
    }
    printf("输出链表元素为:");
    p = *L;
    while (p->next != NULL) {
        printf("%d ", p->next->data);
        p = p->next;
    }
    printf("\n");
}

void insertx(LinkList *L, int i, int x) {
    struct Lnode *p, *q;
    p = *L;
    int pos = 0;

    // 如果i小于等于0,则将x插入表头之后
    if (i <= 0) {
        q = (struct Lnode *)malloc(sizeof(struct Lnode));
        if (q == NULL) {
            printf("Memory allocation failed!\n");
            exit(1);
        }
        q->data = x;
        q->next = p->next;
        p->next = q;
        num++;
    } else {
        // 查找第i个位置
        while (p->next != NULL && pos < i - 1) {
            p = p->next;
            pos++;
        }
        // 如果i大于链表长度,则将x插入链表末尾
        if (p->next == NULL) {
            q = (struct Lnode *)malloc(sizeof(struct Lnode));
            if (q == NULL) {
                printf("Memory allocation failed!\n");
                exit(1);
            }
            q->data = x;
            q->next = NULL;
            p->next = q;
        } else {
            // 在第i个位置之后插入x
            q = (struct Lnode *)malloc(sizeof(struct Lnode));
            if (q == NULL) {
                printf("Memory allocation failed!\n");
                exit(1);
            }
            q->data = x;
            q->next = p->next;
            p->next = q;
            num++;
        }
    }

    printf("插入元素后的链表为:");
    p = *L;
    while (p->next != NULL) {
        printf("%d ", p->next->data);
        p = p->next;
    }
    printf("\n");
}

int findx(LinkList &L,int x)
{
	LinkList p;
	p=L;
	int location=1;
	while(p->next!=NULL)
	{
		if(p->next->data==x)
		{
			return location;
		}
		location++;
		p=p->next;
	}
 return 0;
 } 
 
int countx(LinkList &L,int x)
 {
 	LinkList p;
	p=L;
	int count=0;
	while(p->next!=NULL)
	{
		if(p->next->data==x)
		{
		count++;
		}
		p=p->next;
	}
if(count==0)
return 0;
else
return count;
 }

int main() {
    int m, x, i;
    LinkList L;
    createlist(&L);
    printf("\n");
    printf("请输入您要查询的元素:");
scanf("%d",&x);
int getlocation=findx(L,x);
if(getlocation==0)
{
	printf("未找到您要查询的元素"); 
}
else
printf("您要查询的元素在序号%d位置",getlocation);
printf("\n");
printf("\n");


printf("请输入您要统计个数的元素:");
scanf("%d",&m); 
int getcount=countx(L,m);
printf("您要统计的元素%d在链表中总共有%d个",m,getcount); 

printf("\n");
printf("\n");
    printf("请输入第i个元素和且要在其后插入的值x(以空格分隔):");
    scanf("%d %d", &i, &x);
    insertx(&L, i+1, x);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1561551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行车记录打不开?数据恢复有高招!

行车记录打不开&#xff0c;是许多车主在使用行车记录仪时常遇到的问题。当启动设备时&#xff0c;屏幕无反应或提示错误&#xff0c;让人不禁焦虑&#xff0c;担心重要的行车记录丢失。 行车记录打不开原因分析 行车记录打不开&#xff0c;其背后的原因可能复杂多样。硬件故障…

每日学习笔记:C++ STL算法分类

非更易型 更易型 移除型 变序型 排序型 已排序区间算法 数值型算法

【嵌入式系统设计师】软考2024年5月报名流程及注意事项

2024年5月软考嵌入式系统设计师报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息…

行车记录打不开?别慌,数据恢复有高招!

行车记录打不开&#xff0c;这恐怕是许多车主都曾经遭遇过的烦恼。在驾驶途中&#xff0c;行车记录仪本应是记录美好瞬间、保障行车安全的重要工具&#xff0c;但一旦它出现打不开的情况&#xff0c;所有的期待与信赖便瞬间化为乌有。面对这种情况&#xff0c;我们该如何应对&a…

【C++的奇迹之旅(二)】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例

文章目录 &#x1f4dd;前言&#x1f320; C关键字(C98)&#x1f309; 命名空间&#x1f320;命名空间定义&#x1f309;命名空间使用 &#x1f320;命名空间的使用有三种方式&#xff1a;&#x1f309;加命名空间名称及作用域限定符&#x1f320;使用using将命名空间中某个成员…

SAP ABAP批量复制PFCG角色并生效

文章目录 需求整体流程1. 检查角色是否存在2. 复制角色3. 批量生成参数文件4. 如果角色用户还是出现未比较&#xff0c;可在PFCG界面选择批量比较 细节上载模板代码&#xff1a; 小结 需求 最近碰到一个需求&#xff0c;需要对大批量的PFCG角色进行复制并使其生效 整体流程 …

Java 堆外内存及调优

文章目录 直接内存简介为什么DirectByteBuffer可以优化 IO 性能 直接内存的分配直接内存的回收直接内存跟踪与诊断 直接内存简介 直接内存(Direct Memory) 并不是虚拟机运行时数据区的一部分&#xff0c;并非Java虚拟机规范中定义的内存区域。但是这部分内存的频繁使用&#x…

动手机器学习支持向量机+习题

非参数化模型&#xff0c;当数据集规模增大时&#xff0c;其参数量也相应变多 希望从这无数个可以分隔两个点集的超平面中&#xff0c;挑选出与任意一点间隔&#xff08;margin&#xff09;的最小值最大的平面 支持向量机的数学描述 对上式来说&#xff0c;当w和b的大小同时变…

书生·浦语大模型实战营(第二期)-书生·浦语大模型全链路开源体系

课程来源&#xff1a;书生浦语大模型全链路开源体系 1.大模型成为发展通用人工智能的重要途径 专用模型:针对特定任务,一个模型解决一个问题 通用大模型:一个模型应对多种任务、多种模态 2.书生浦语大模型开源历程 书生浦语2.0面向不同的使用需求,每个规格包含三个模型版本:I…

golang语言系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 golang语言系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的Aut…

04-MySQL数据库-权限管理

一、查看权限 1&#xff0c;查看系统所有权限 mysql> show privileges; 权限字段介绍 privileges #权限名称 context #对象&#xff0c;表示可以对数据库&#xff0c;那些资源、进行哪些操作&#xff1b; comment #描述&#xff0c;备注解释说明&#xff1b; Grant…

C++刷题篇——04找等值元素

一、题目 二、解题思路 1、分割后放进二维数组 2、使用map&#xff0c;key为数值&#xff0c;value为其坐标 3、遍历二维数组元素&#xff0c;再在map中找该元素对应的value值&#xff08;二维数组形式&#xff09;&#xff0c;倘若value.size为1&#xff0c;那直接返回-1&…

稳定性生产总结

本期我们来谈下稳定性生产这个话题&#xff0c;稳定性建设目标有两个&#xff1a;降发生、降影响&#xff0c; 在降发生中的措施是做到三点&#xff1a;系统高可用、 高性能、 高质量&#xff0c;三高问题确实是一个很热的话题&#xff0c;里面涉及很多点。 在降影响中要做到…

数据结构03:栈、队列和数组 队习题01[C++]

考研笔记整理~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构03&#xff1a;栈、队列和数组_-CSDN博客~&#x1f95d;&#x1f95d; 本篇作为链表的代码补充&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题…

Mamba和状态空间模型(SSM)的视觉指南:替代 Transformers 的语言建模方法

原文地址&#xff1a; A Visual Guide to Mamba and State Space Models 2024 年 2 月 19 日 论文地址&#xff1a;https://arxiv.org/pdf/2312.00752.pdf 这篇论文介绍了一种新型的线性时间序列模型Mamba&#xff0c;它通过选择性状态空间&#xff08;Selective State Space…

【Redis持久化】RDB、ROB介绍和使用

RDB、ROB介绍和使用 引言ROB介绍配置指令介绍使用指令&#xff1a;dump文件修复指令快照禁用 AOF工作流程&#xff1a;文件重写&#xff1a;三种写回策略&#xff1a; 混合使用 引言 持久化的目的&#xff0c;其实就是在Redis重启或者中途崩溃的时候能够依靠自身恢复数据&…

953: 单链表的删除操作的实现

学习版 【C语言】 【C】 #include <iostream>class MyLinkedList{public:struct LinkedNode{int val;LinkedNode* next;LinkedNode(int x):val(x),next(NULL){};}; MyLinkedList(){dummyHeadnew LinkedNode(0);length0;}~MyLinkedList(){while (dummyHead){LinkedNode…

vulhub打靶记录——driftingbox

文章目录 主机发现端口扫描目录扫描爆破子域名提权总结 主机发现 使用nmap扫描局域网内存活的主机&#xff0c;命令如下&#xff1a; nmap -sP 192.168.56.0/24192.168.56.1&#xff1a;主机IP&#xff1b;192.168.56.100&#xff1a;DHCP服务器IP&#xff1b;192.168.56.101…

代码随想录第二十六天 | 回溯算法P3 |● 39. ● 40.● 131.

39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重…

windows下部署llama.cpp

下载cmake 下载地址 解压&#xff0c;设置Path环境变量D:\CMake\bin 打开cmd输入cmake -version 安装mingw powershell下执行 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser iex "& {$(irm get.scoop.sh)} -RunAsAdmin" scoop bucket add extras s…