求大神教我c++ 谢啦 是关于链表删除的

给定一串数字,用链表结构进行存储。然后给定针对该链表的若干删除操作,要求将执行删除操作后的结果输出。第一行:输入一个整数n,表示这串数字有n个(n大于等于1)。第二行:输... 给定一串数字,用链表结构进行存储。然后给定针对该链表的若干删除操作,要求将执行删除操作后的结果输出。
第一行:输入一个整数n,表示这串数字有n个(n大于等于1)。
第二行:输入这n个整数。
第三行:输入一个整数m,表示需要执行m次删除操作。(m≤n)
后面m行:每行输入一个整数a ,表示要删除当前链表中的第a个数字。(假设链表中第一个节点的编号为1)。
执行了m次删除操作中,输出剩下的n-m个数字。每个数字用空格空开。
Sample Input
3
2 1 3
2
1
1
Sample Output
3
展开
 我来答
笃侠6A
2015-06-02 · TA获得超过3734个赞
知道大有可为答主
回答量:3205
采纳率:75%
帮助的人:3267万
展开全部
#include<iostream>
using namespace std;

struct Node{
int data;
Node *next;
};
Node * ins(Node *head, int x){
Node *p,*q,*t;
t=new Node;
t->data=x;
t->next=0;
if(head==0){
head=t;
return head;
}
q=head;
p=head->next;
while(p!=0){
q=p;
p=p->next;
}
q->next=t;
return head;
}
Node * del(Node *head, int n){
Node *p,*q;
int i;
if(n==1){
p=head;
head=head->next;
delete p;
return head;
}
q=head;
p=head->next;
for(i=2; i<n; i++){
q=p;
p=p->next;
}
q->next=p->next;
delete p;
return head;
}
void disp(Node *head){
Node *p;
p=head;
while(p){
cout <<p->data <<" ";
p=p->next;
}
cout <<endl;
return;
}
void main(){
int i,n,m,x;
Node *h=0;
cin >>n;
for(i=1; i<=n; i++){
cin >>x;
h=ins(h,x);
}
// disp(h);
cin >>m;
for(i=1; i<=m; i++){
cin >>x;
h=del(h,x);
}
disp(h);
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shihoumacili
高粉答主

2016-02-02 · 每个回答都超有意思的
知道大有可为答主
回答量:1.1万
采纳率:87%
帮助的人:491万
展开全部

思路如下:

  1. 假设要删除链表的中间某节点,相邻节点的链接关系是:前一节点→中间节点→后续节点。以指向前一节点的指针为基准指针p1。

  2. 由于每个节点都包含着指向后续节点的指针,所以删除本节点之前必须保留指向后续节点的指针。pTemp=p1->next->next;

  3. 删除本节点。free(p1->next);//注意:释放本节点之后,p1->next所指向的内存区已经无效了,所以p1->next已经成为无效的空指针了。

  4. 然后把前一个节点看作为当前节点。将指向后续节点的指针保存到当前节点中。p1->next=pTemp;//将后续节点链接上。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gsidnvfjs
2019-04-09
知道答主
回答量:2
采纳率:0%
帮助的人:1528
展开全部
直接上答案
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int number;
struct node*next;
}SNODE;
SNODE*del_node(SNODE*head,int pos)
{
SNODE*p,*q;
int count;
p=head->next;
q=head;
count=1;
while(p&&count!=pos)
{
q=p;
p=p->next;
count++;
}
q->next=p->next;
return(head);
}
void print(SNODE*head)
{
SNODE*p;
p=head->next;
while(p!=NULL)
{
printf("%d",p->number);
if(p->next==NULL)
printf("\n");
else
printf(" ");
p=p->next;
}
}
SNODE*creat(int n)
{
int num,i;
SNODE*h,*s,*r;
h=(SNODE*)malloc(sizeof(SNODE));
h->next=NULL;
r=h;
for(i=0;i<n;i++)
{
scanf("%d",&num);
s=(SNODE*)malloc(sizeof(SNODE));
s->number=num;
r->next=s;
r=s;
}
r->next='\0';
return h;
}
int main()
{
SNODE*head;
int m,n,i,count;
scanf("%d",&n);
head=creat(n);
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&count);
head=del_node(head,count);
}
print(head);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-06-02
展开全部
链表,这很简单
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式