目录
更多链表操作请访问
问题描述
【问题描述】
输入n(n>1)个正整数,每次将输入的整数插入到链表头部。-1表示输入结束。再输入一个正整数,在链表中查找该数据并删除对应的节点。要求输出进行删除操作后链表中所有节点的值。
【输入形式】
输入以空格分隔的n个整数,以-1结束输入,再输入一个要删除的整数。
【输出形式】
从链表第一个元素开始,输出链表中所有的节点值。以空格分隔。
【样例输入】
2 4 6 7 8 4 -1 2 |
【样例输出】
4 8 7 6 4 |
问题分析
链表的头插
头插:首先有三个结构体指针 p1,p2,head,head指向第一个结构体,p1和p2为操作指针。还需要类似如下的结构体num。
1.第一步,p1开辟一个结构体并指向它,然后这个结构体的next指针为空。
2. 第二步,p2开辟一个结构体并指向它。
3.第三步,p2的next指针指向p1指向的结构体。
第四步,p1,p2,head共同指向p2指向的结构体。
第五步,p2再开辟一个指针并指向它
第六步,p2指向结构体的next指向 p1和head指向的结构体。
第七步,p1,p2,head共同指向p2指向的结构体。
这就是头插了。
链表的删除
首先需要遍历链表
1.头部删除,head=head->next,让head指向之前头指针指向结构体的下一个结构体。(因为p1和p2是操作指针所以不用管它们)
删除前:
删除后
2.中间删除,让操作指针p1对链表进行遍历,并且让p2之向p1之前的结构体,p1找到目标结构体,如下图。
然后p2->next=p1->next,如下图。
3.尾部删除,让操作指针p1对链表进行遍历,并且让p2之向p1之前的结构体,p1找到目标结构体,如下图。
然后p2->next=NULL,如下图。
代码演示
源码
#include<stdio.h>
#include<stdlib.h>
struct num{
int n;
struct num *next;
};
int main()
{
int n,m;
struct num *p1,*p2,*p3,*head;
p1=(struct num *)malloc(sizeof(struct num));
scanf("%d",&n);
if(n!=-1)
{
p1->n=n;p1->next=NULL;m=1;
}
else return 0;
while(1)
{
scanf("%d",&n);
if(n==-1)break;
p2=(struct num *)malloc(sizeof(struct num));
p2->n=n;
p2->next=p1;
p1=p2;
head=p2;
m++;
}
int N;
scanf("%d",&N);int k=1;
p1=head;
while(p1!=NULL)
{
if(k==1&&p1->n==N)
{
head=head->next;m--;
p2=head;
p1=p1->next;
}
else if(k>1&&k<m&&p1->n==N)
{
p2->next=p1->next;m--;
p1=p1->next;
}
else if(k==m&&p1->n==N)
{
p2->next=NULL;m--;
}
else {
k++;
p2=p1;
p1=p1->next;
}
}
p1=head;
while(p1!=NULL)
{
printf("%d ",p1->n);
p1=p1->next;
}
}
运行结果
扩展
完成头部,中间,尾部相结合的链表连续删除
欢迎指正。
使用类
源码
#include<iostream>
using namespace std;
typedef struct num{
int n;
struct num *next;
}list;
class A
{
private:
list *head;
int N;
public:
void fin()
{
cout<<"请输入元素:"<<endl;
int n;
list *p1,*p2;
p1=new list;
cin>>n;
if(n!=-1)
{
p1->n=n;
p1->next=NULL;
N=1;
head=p1;
}
else
{
head=NULL;
N=0;
}
while(1)
{
cin>>n;
if(n==-1)break;
p2=new list;
p2->n=n;
p2->next=p1;
p1=p2;
head=p2;
N++;
}
}
void tin()
{
cout<<"请输入元素:"<<endl;
int n;
list *p1,*p2;
p1=new list;
cin>>n;
if(n!=-1)
{
p1->n=n;
p1->next=NULL;
N=1;
head=p1;
}
else
{
head=NULL;
N=0;
}
while(1)
{
cin>>n;
if(n==-1)break;
p2=new list;
p2->n=n;
p2->next=NULL;
p1->next=p2;
p1=p2;
N++;
}
}
void delete1()
{
list *p1,*p2;
int m;cout<<"输入要删除的整数:";
cin>>m;int k=1;
p1=head;
while(p1!=NULL)
{
if(k==1&&p1->n==m)
{
head=head->next;N--;
p2=head;
p1=p1->next;
}
else if(k>1&&k<N&&p1->n==m)
{
p2->next=p1->next;N--;
p1=p1->next;
}
else if(k==N&&p1->n==m)
{
p2->next=NULL;N--;
}
else {
k++;
p2=p1;
p1=p1->next;
}
}
}
void display()
{
list *p1=head;
while(p1!=NULL)
{
printf("%d ",p1->n);
p1=p1->next;
}
}
};
int main()
{
A t;
int c;
cout<<"1.头插 2.尾插"<<endl<<"输入1或2:";
cin>>c;
if(c==1)t.fin();
else t.tin();
t.delete1();
t.display();
}