直接进入正题
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结点就已经是NULL了
putchar('-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!