当前位置: 首页 > news >正文

设计在单链表中删除值相同的多余结点的算法(包括指针的引用的知识点)

1 C++中指针与引用的区别

引用相当于起别名
int m;
int &n = m;

n 相当于 m 的别名(绰号),对 n 的任何操作就是对m的操作

所以 n 既不是m的拷贝,也不是指向 m 的指针,其实n就是 m 它自己


引用的注意事项:

1 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)
2 不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL)
3 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)

例如:

int i = 5;
int j = 6;
int &k = i;
k = j; //将k和i的值都变为了6

语句 k = j 并不能将 k 修改成为 j 的引用,只是把k的值改变成为 6。

由于 k 是 i 的引用,所以i的值也变成了 6。


引用的主要功能是传递函数的参数和返回值。

C++ 语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

1 值传递:

void Func1(int x) 
{ x = x + 10; 
} 
... 
int n = 0; 
Func1(n); 
cout << "n = " << n << endl; // n = 0 

2 指针传递:

void Func2(int *x) 
{ (* x) = (* x) + 10; 
} 
... 
int n = 0; 
Func2(&n); 
cout << "n = " << n << endl; // n = 10

3 引用传递:

void Func3(int &x) 
{ x = x + 10; 
} 
... 
int n = 0; 
Func3(n); 
cout << "n = " << n << endl; // n = 10

x 和 n 是同一个东西,改变 x 等于改变 n


2 C++指针的引用*&

如果想:在一个函数中修改指针的指向,并且在退出函数后这种操作保留,就需要使用指针的引用

#include <iostream>
using namespace std;struct point {int x;int y;
};void changenum1(point *&pnum) { //point *&pnum表示指向point类型的指针的引用,即point*类型变量的引用pnum = new point;pnum->x = 4;
}void changenum2(point *pnum) {pnum = new point;pnum->x = 4;
}void test1() {point *num = new point;num->x = 10;changenum1(num);std::cout << "指针引用" << num->x << endl;
}void test2() {point *num = new point;num->x = 10;changenum2(num);std::cout << "指针" << num->x << endl;
}int main() {cout << "开始执行程序" << endl;test1();test2();cout << "执行程序完毕" << endl;return 0;
}
point *&pnum:
表示指向point类型的指针的引用(即point* 类型变量的引用)point *&pnum = point* &pnum(比较好理解)

3 题目

设计在单链表中删除值相同的多余结点的算法

算法:

typedef struct list
{int data;struct list *next;
}LNode;void deleteLike(LNode* &head)
{LNode *p,*q,*s;for(p=head;p!=0;p=p->next){for(q=p->next,s=q; q!=0; )if (q->data==p->data) //删除相同值的节点 {s->next=q->next; free(q);q=s->next;}else{ s=q;q=q->next;}}
}

完整代码:

#include<stdio.h>
#include<stdlib.h>#define N 10typedef struct list
{int data;struct list *next;
}LNode;void deleteLike(LNode* &head)
{LNode *p,*q,*s;for(p=head;p!=0;p=p->next){for(q=p->next,s=q; q!=0; )if (q->data==p->data) //删除相同值的节点 {s->next=q->next; free(q);q=s->next;}else{ s=q;q=q->next;}}
}LNode *creatlist(int *a)
{LNode  *h,*p,*q;      int  i;h=p=(LNode *)malloc(sizeof(LNode));for(i=0; i<N; i++){q=(LNode *)malloc(sizeof(LNode));q->data=a[i];  p->next=q;  p=q;}p->next=0;return h;
}void outlist(LNode  *h)
{LNode  *p;p=h->next;if (p==NULL)  printf("\nThe list is NULL!\n");else{printf("\nHead");do {printf("->%d",p->data);  p=p->next;    } while(p!=NULL);printf("->End\n");}
}int main( )
{     LNode *A; int a[N]={1,3,4,1,10,3,4,8,6,8};A=creatlist(a);deleteLike(A);outlist(A);return 0;
}
http://www.lryc.cn/news/13879.html

相关文章:

  • 100份简历才找一个合适的,2023,软件测试岗位饱和了吗?
  • (三十七)vue 项目中常用的2个Ajax库
  • Python打包调试问题解决
  • 计算机SCI期刊自引率一般是多少? - 易智编译EaseEditing
  • 力扣(LeetCode)417. 太平洋大西洋水流问题(2023.02.19)
  • Python解题 - CSDN周赛第30期 - 天然气订单
  • 移动WEB开发一、基础知识
  • 07 二叉树
  • 3|物联网控制|计算机控制-刘川来胡乃平版|第4章:过程通道与人机接口-4.1数字量输入输出通道接口|课堂笔记|ppt
  • 从 ClickHouse 到 Apache Doris,腾讯音乐内容库数据平台架构演进实践
  • linux线程的基本知识
  • docker swarm 集群服务编排部署指南(docker stack)
  • ESP开发环境搭建
  • 内网安全——ssH协议WindowsLinux密码获取hashcat
  • 【编程入门】应用市场(安卓版)
  • 【图像分类】卷积神经网络之LeNet5网络模型结构详解
  • 2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等
  • 【云原生kubernetes】k8s Ingress使用详解
  • [数据结构]:顺序表(C语言实现)
  • 【大厂高频必刷真题100题】《有序矩阵中第 K 小的元素》 真题练习第27题 持续更新~
  • 两年外包生涯做完,感觉自己废了一半....
  • 02- OpenCV绘制图形及图像算术变换 (OpenCV基础) (机器视觉)
  • 猜数字大小 II
  • CCNP350-401学习笔记(251-300题)
  • 掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表
  • 算法训练营 day50 动态规划 单词拆分 多重背包理论基础
  • 一文3000字用Postman从0到1实现UI自动化测试
  • 2023年美国大学生数学建模C题:预测Wordle结果建模详解+模型代码(一)
  • spring-boot 整合 前端框架 React 增删改查(附源码)
  • 未来的城市:智慧城市定义、特征、应用、场景