链表的基本操作

创建链表

#include<bits/stdc++.h>
using namespace std;
struct node{
	//链表结点
	int data;
	node *next; 
};
//创建链表
node *create(int Array[]){
	node *p,*pre,*head;//pre保存当前结点的前驱结点,head为头结点
	head=new node;//创建头结点
	head->next=NULL;//头结点不需要数据域,指针域初始化为NULL
	pre=head;//记录pre为head
	for(int i=0;i<5;i++){
		p=new node;//新建结点
		//将Array[i]作为新建结点的数据域,也可以输入
		p->data=Array[i];
		p->next=NULL;//将新结点的指针域设为NULL
		pre->next=p;
		pre=p;//把pre设为p,作为下个结点的前驱结点 
	} 
	return head;//返回头结点指针 
} 
int main(){
	int Array[5]={5,3,6,1,2};
	node *l=create(Array);//新建链表,返回的头指针head赋给L
	l=l->next;//从第一个结点开始有数据域
	while(l!=NULL){
		printf("%d ",l->data);
		l=l->next;
	} 
	return 0;
}

输出结果:5 3 6 1 2

 

查找元素

 

查找元素时只需要从第一个结点开始,不断判断当前结点的数据域是否等于x,如果等于,计数器count加一,这样到达链表结尾时,count的值就是链表中元素x的个数。

//在以head为头结点的链表上计数元素x的个数
int search(node *head,int x){
	int count=0;//计数器
	node *p=head->next;//从第一个结点开始
	while(p!=NULL){
		//没有到达链表末尾
		if(p->data==x){
			count++;//当前结点数据域为x,则count++; 
		} 
		p=p->next;//指针指向下一个结点 
	} 
	return count;//返回计数器count 
} 

上面这部分代码可以直接写在”创建链表“部分的代码中使用,把create函数返回的头指针L直接作为第一个参数L传入即可。

 

插入元素

 

对链表来说,插入元素是指在给定的链表中的地方插入一个结点。例如,在链表的第三个位置插入元素x,是指在插入操作完成之后链表的第3个元素为x

示例代码:

//将x插入以head为头结点的链表的第pos个位置上
void insert(node *head,int pos,int x){
	node *p=head;
	for(int i=1;i<pos;i++){
		p=p->next;//到插入位置的前一个结点 
	}
	node *q=new node;//新建结点
	q->data=x;//新结点的数据域为x 
	q->next=p->next;//新结点的下一个结点指向原先插入位置的结点 
	p->next=q;//前一个位置的结点指向新结点 
} 

删除元素

 

对链表来说,删除元素是指删除链表上的所有值为给定的数x

删除操作时这样进行的

1、由指针变量p枚举结点,另一个指针变量pre表示p指向结点的前驱结点

2、当p所指结点的数据域恰好为x时,进行下面三个操作

(1)令pre所指结点的指针域next指向p结点所指结点的下一个结点

(2)释放p所指结点的内存空间

(3)令p指向pre结点的下一个结点

具体代码如下:

void del(node *head,int x){
	node *p=head->next;//p从第一个结点开始枚举
	node *pre=head;//pre始终保存p前驱结点的指针
	while(p!=NULL){
		if(p->data==x){
			//数据域恰好为x,说明要删除该结点
			pre->next=p->next;
			delete(p);
			p=pre->next; 
		}else{
			//数据域不是x,则p和pre都后移一位
			pre=p;
			p=p->next;	 
		}
	} 
} 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值