链表的基本操作

直接进入正题

1.链表结点的创建

struct node{
	int date;  ==>链表中某结点的值
    node *next;  ==>链表中指向某结点的下一个结点的指针(node类型)
}; 

2.串联结点

void link(node *tou){ ==>将头指针传入link函数内
	node *p=tou; ==>负责链接工作的指针
	node *q;  ==>负责提供新结点的指针
	for(int i=1;i<=10;i++){ ==>例如用链表将1-10链接
		q=(node *)malloc(sizeof(node)); ==>申请新内存
		q->date=i;
		q->next=NULL;
		p->next=q;
		p=p->next;
	}
	return;
} 

3.查找结点

int find(node *tou,int sign){ ==>查找值为sign的结点的位置
	node *k=tou;
	int i=1; ==>下标
	while(k->next!=NULL){
		k=k->next;
		if(k->date==sign) return i; ==>如果相等,返回下标
		i++;
	}
	return -1; ==>如果没有这个元素或者为NULL(查询错误),则返回-1
}

4.插入结点
在这里插入图片描述

个人认为没必要对插入位置分类,这段代码适用于任何位置

void insert(node *tou,int pos,int res){ 
	node *k=tou;  		      ==>默认头结点的下标是1,头结点!= 头指针
	for(int i=1;i<=pos;i++){  ==>在pos的后面插入一个date为res的结点 
		if(k==NULL){          ==>如果还没到pos结点就已经是NULLputchar('-1');		 说明插入的位置非法,返回-1
			return; 
		}
		k=k->next;           ==>循环让k指向下一个结点,最后指向pos结点
	}
	node *temp=(node *)malloc(sizeof(node));  ==>申请新的结点储存res 
	temp->next=k->next;                       ==>结合图解插入操作
	k->next=temp;
	temp->date=res;
	return;
}

5.删除结点

void erase(node *tou,int pos){  ==>删除下标为pos的结点
	node *k=tou;
	for(int i=1;i<=pos-1;i++){
		if(k==NULL){
			puts("the position is not available!");
			return ;
		}
		k=k->next; 		     ==> k 储存要删除节点的前一个位置 !!!
	}
	node *temp=k->next;	     ==>用temp暂时保存要删除的节点
							    防止节点丢失(不知道为啥) 
	k->next=k->next->next;   ==>直接跳过要删除的元素,妙啊
	free(temp);  			 ==>释放临时节点 
	return ; 
} 

最后献上一个代码栗子供参考ovo

#include <bits/stdc++.h>
using namespace std;
struct node{
	int date;
	node *next;
}; 
void link(node *tou){
	node *p=tou;
	node *q;
	for(int i=5;i<=15;i++){
		q=(node *)malloc(sizeof(node));
		q->date=i;
		q->next=NULL;
		p->next=q;
		p=p->next;
	}
	return;
} 
int find(node*tou,int sign){
	node *k=tou;
	int i=1;
	while(k->next!=NULL){
		k=k->next;
		if(k->date==sign) return i;
		i++;
	}
	return -1;
}
void insert(node *tou,int pos,int res){
	node *k=tou;
	for(int i=1;i<=pos;i++){
		if(k==NULL){
			puts("-1");
			return; 
		}
		k=k->next;
	}
	node *temp=(node *)malloc(sizeof(node));
	temp->next=k->next;
	k->next=temp;
	temp->date=res;
	return;
}
void erase(node *tou,int pos){
	node *k=tou;
	for(int i=1;i<=pos-1;i++){
		if(k==NULL){
			puts("the position is not available!");
			return ;
		}
	k=k->next; 
	node *temp=k->next; 
	k->next=k->next->next; 
	free(temp); 
	return ; 
} 
int main(){
	std::ios::sync_with_stdio(false);
	node *p,*q,*head,*temp;
	head=(node *)malloc(sizeof(node));
	//链接结点
	link(head);
	temp=head;
	while(temp->next!=NULL){
		cout<<temp->next->date<<" ";
		temp=temp->next;
	}
	//在 pos=4 的位置后面插入值为12的结点
	cout<<endl;
	insert(head,4,12);
	temp=head;
	while(temp->next!=NULL){
		cout<<temp->next->date<<" ";
		temp=temp->next;
	}
	//删除 pos=6 的结点
	cout<<endl;
	erase(head,6);
	temp=head;
	while(temp->next!=NULL){
		cout<<temp->next->date<<" ";
		temp=temp->next;
	}
	//查找值为 8 的结点的下标
	cout<<endl;
	cout<<find(head,8);
}
====================================================================
运行结果:
5 6 7 8 9 10 11 12 13 14 15        ==>初始化链表
5 6 7 8 12 9 10 11 12 13 14 15	   ==>插入
5 6 7 8 12 10 11 12 13 14 15	   ==>删除
4								   ==>查找

看完觉得懂了别忘了点个赞哦0v0!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值