我们知道,链表有两个重要的概念,一个数据域,一个指针域
将两个数据域链接起来的就是指针域
理解了这两个概念就好办了
首先需要做的就是创建一个结构体存放我们的数据和指针
typedef struct Node{
int value;
Node *next; //创建一个链表所需要用的结构体
};
然后我们创建一个插入链表的函数
void insert_node(Node *p)
{
Node *temp,*p1,*p2;
int n,m;
temp = p1 = p2 = (Node*)malloc(sizeof(Node));
cout<<"请输入要插入的节点位置";
cin>>n;
p1 = p;
for(int i =1;i<n;p1=p1->next,++i); //这里使用一个for循环不断将指针往下挪,直到找到我们想要的位置
p2 = p1;
p2=p2->next;
cout<<"请输入要插入的节点的数值";
cin>>m;
temp->value = m;
temp->next=p2;
p1->next = temp;
}
这里需要注意的,我这里使用了三个临时变量,分别是temp,p1,p2;这是因为当我们需要插入一个数据的时候,我们需要将上一个结点的指针指向我们所需要插入的这个节点的指针,然后在将我们插入的这个结点的指针指向原本上一个结点指向的那个结点的指针
(感觉有点绕,但多读几遍就很容易理解了 ヾ(◍°∇°◍)ノ゙)
然后我们创建一个删除结点的函数
void delete_data(Node *p)
{
Node *temp,*p1,*p2;
int n,m;
temp = p1 = p2 = (Node*)malloc(sizeof(Node));
cout<<"请输入要删除的节点位置";
cin>>n;
p1 = p;
for(int i =1;i<n;p1=p1->next,++i);
p2 = p1;
p2 = p2->next;
p2 = p2->next;
temp = p1->next;
free(temp); //释放该节点的内存
p1->next = p2;
}
这里需要注意的是每次删除完我们都需要将这个指针所在的内存进行释放,为什么要这样呢,嗯这是一个好习惯!
最后创建一个查询的函数,其实这个很简单,把插入的函数稍微剪裁一下就可以了
void search_node(Node *p)
{
Node *temp;
temp = (Node *)malloc(sizeof(Node));
int n ;
cout<<"请输入要查询节点的位置"<<endl;
cin>>n;
temp = p->next;
for(int i = 1;i < n;temp=temp->next,++i);
cout<<"查询的结果为:";
cout<<temp->value;
cout<<endl;
}
最后附上完整代码
#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
int value;
Node *next; //创建一个链表所需要用的结构体
};
void insert_data(Node *p,int num)
{
Node *p1,*p2;
p1 = p2 = (Node*)malloc(sizeof(Node)); //分配内存
p1->next = NULL;
if(p->next != NULL)
p1 = p;
while(p1->next != NULL)
p1 = p1->next;
if(p->next == NULL)
{
p1->value = num;
p1->next = NULL;
p->next = p1;
}
else
{
p2->value = num;
p2->next = NULL;
p1->next = p2;
}
}
void insert_node(Node *p)
{
Node *temp,*p1,*p2;
int n,m;
temp = p1 = p2 = (Node*)malloc(sizeof(Node));
cout<<"请输入要插入的节点位置";
cin>>n;
p1 = p;
for(int i =1;i<n;p1=p1->next,++i);
p2 = p1;
p2=p2->next;
cout<<"请输入要插入的节点的数值";
cin>>m;
temp->value = m;
temp->next=p2;
p1->next = temp;
}
void delete_data(Node *p)
{
Node *temp,*p1,*p2;
int n,m;
temp = p1 = p2 = (Node*)malloc(sizeof(Node));
cout<<"请输入要删除的节点位置";
cin>>n;
p1 = p;
for(int i =1;i<n;p1=p1->next,++i);
p2 = p1;
p2 = p2->next;
p2 = p2->next;
temp = p1->next;
free(temp); //释放该节点的内存
p1->next = p2;
}
void search_node(Node *p)
{
Node *temp;
temp = (Node *)malloc(sizeof(Node));
int n ;
cout<<"请输入要查询节点的位置"<<endl;
cin>>n;
temp = p->next;
for(int i = 1;i < n;temp=temp->next,++i);
cout<<"查询的结果为:";
cout<<temp->value;
cout<<endl;
}
void show(Node *p)
{
Node *temp;
temp = p;
if(temp->next== NULL)
cout<<"链表为空!";
while(temp->next!= NULL)
{
temp = temp->next;
cout<<temp->value<<" ";
}
cout<<endl;
}
int main()
{
Node *pHead = NULL;
pHead = (Node*)malloc(sizeof(Node));
pHead->next = NULL;
show(pHead);
int n,m;
n = 2;
while(n != 0)
{
cout<<"1插入 2删除 3查询 0 退出"<<endl;
cin>>m;
switch(m)
{
case 1:
insert_node(pHead);
show(pHead);
break;
case 2:
delete_data(pHead);
show(pHead);
break;
case 3:search_node(pHead);break;
default:break;
}
n = m;
}
return 0;
}
学会了给个赞把(*╹▽╹*)