当前位置:首页 > C++知识 > 正文内容

【算法】单链表的一些操作(存取、查找、取出、插入、删除)

亿万年的星光4年前 (2021-12-18)C++知识1518

一、单链表结构的建立与输出

#include<iostream>
using namespace std;
struct Node{
	int data;
	Node *next;
};
Node *head, *p, *r;  //r指向链表的当前最后一个结点,可以称为尾指针 
int x;
int main(){
	cin>>x;
	head=new Node;  //申请头结点
	r=head;  
	while(x!=-1){  //读入的数非-1 
		p=new Node;  //否则,读入一个新结点 
		p->data=x;  //把数据放入数据域 
		p->next=NULL; // 先把当前这个结点的指针域变为NULL
		r->next=p;  //把新结点链接  接到前面的链表中(p可以认为是一个结点的头指针), 
		r=p; //尾指针后移一个
		cin>>x; 
	}
	
	p=head->next;  //头指针没有数据,只能从第一个结点开始就可以了 
	while(p->next !=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;		
	} 
	cout<<p->data<<endl;	
	return 0; 
}

二、单链表的操作—查找满足条件的结点

	p=head->next;  //头指针没有数据,只能从第一个结点开始就可以了 
	while(p->data !=x && (p->next)!=NULL)
		p=p->next;
	if(p->data==x){
		//如果找到要找的数据,那么准备处理 
	}else{
		//如果没找到,则做其他处理 
	}
	//还可以按照下面的代码,处理所有遇到的数据。
	p=head->next;
	while(p-next!=NULL){
		if(p->data==x){
			//处理数据 
		}
		p=p->next; 
	}	

三、取出第i个结点的数据域

void get(Node *head,int i){
	Node *p;int j;
	p=head->next;
	j=1;
	while(p!=NULL && (j<i)){
		p=p->next;
		j=j+1;
	} 
	if((p!=NULL) && (j==i))
		cout<<p->data;
	else
		//输出其他	
}

四、单链表的插入操作

void insert(Node * head,int i,int x){//插入x到第i个元素之前 
	Node *p,*s;
	int j;
	p=head;
	j=0;
	while((p!=NULL)&&(j=i-1)){
		p=p->next;
		j=j+1; 
	} 
	if(p==NULL){
		cout<<"NO";
	}else{
		s=new Node;
		s->data=x;
		s->next=p->next;
		p->next=s;
	}
}

五、单链表的删除操作

void delete(Node *head,int i){
	Node *p,*s;
	int j;
	p=head;
	j=0;
	while((p->next!=NULL) && (j<i-1)){
		p=p->next;
		j=j+1;
	} 
	if(p->next==NULL){
		cout<<"NO";
	}else{
		s=p->next;
		p->next=p->next->next;
		//或者 p->next =s->next;
		free(s) 
	}
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

C++ 如何隐藏光标

在C++控制台做小游戏的时候,光标一直在闪,影响体验效果,我们可以通过下面的函数隐藏光标位置。void HideCursor(){ CONSOLE_CURSOR_INFO cu...

【数论】快速乘

【数论】快速乘

上一篇文章简单说了龟速乘的问题,有人觉得龟速乘还是太慢了,有没有什么办法再快一点,实际是有的,就是我们今天介绍的 快速乘。快速乘的原理和龟速乘不同,快速乘并不是基于二进制和位运算,严格来说,快速乘是利...

NOIP/CSP-J复赛历年考点

2000计算器的改良税收与补贴乘积最大单词接龙模拟、字符串模拟字符串、动态规划广度优先bfs、字符串2001数的计数最大公约数与最小公倍数求先序排列装箱问题模拟模拟、函数二叉树贪心2002级数求和选数...

C++读取磁盘文件

0.前言简单介绍一下C++读取文件的基本操作。关键技术:freopen() 文件的打开函数 FILE *fp fp=fopen(文件名,使用文件方式) 例如: fp...

【贪心】区间选点

【贪心】区间选点

【题目描述】数轴上有n个闭区间[ai, bi],取尽量少的点,使得每个区间内都至少有一个点。(不同区间内含的点可以是同一个,1<=n<=10000,1<=ai<=bi<=...

组合数的写法

前面我们写过 全排列和排列数 等。这篇文章。我们写一下组合数。例题:从n个数中,选出m个,一共有多少种不同的选法?这是一道典型的组合数公式。我们直接用dfs公式肯定会出现重复的。#include<...