题目描述
1.问题描述
给出初始数据,实现单链表的定义、创建、查找和删除。假设单链表中的结点计数从1开始。
2.算法
单链表结点的存储结构包含两部分:数据、下一结点指针。
单链表的创建:依次为输入的数据分配结点,并按序链接起来。
单链表的查找:给出位置i,若第i个结点存在(1<=i<=表中结点数L),返回结点地址;否则,返回NULL。
单链表的删除:给出位置i,删除第i个结点(1<=i<=L)。
要求定义删除函数:int DeleteList(Node *H,int i) //删除第i个结点成功,返回1;第i个结点不存在,删除不成功,返回0。其中Node是链表结点结构体名,H是链表头指针。
输入
每个样本分2行:
第一行:第一个数字n表示样本数目,其后跟n个样本
第二行:删除测试次数m 后跟m个删除位置
输出
第一行:单链表创建后,输出链表中元素个数和单链表中的全部数据。
第二行至第m+1行:若删除指定位置的数据成功,输出链表中元素个数和单链表中的全部数据;若删除不成功,输出error。
样例输入
5 2 4 3 5 7
3 0 2 4
样例输出
5 2 4 3 5 7
error
4 2 3 5 7
3 2 3 5
代码实现:
//
// Created by HP on 2018/3/9.
//
#include <iostream>
using namespace std;
struct node{
int num;
node *next;
};
int n;
void CreateList(node *head)
{
node *tail=head;
int data;
int i;
for(i=0;i<n;i++){
cin>>data;
node *s=new node;//创建新的节点
s->num=data;
s->next=NULL;
tail->next=s;//将新结点插入链表中
tail=s;
}
}
void ShowList(node *head)
{
cout<<n;
node *display=head->next;
while(display){
cout<<" "<<display->num;
display=display->next;
}
cout<<endl;
}
int Deletelist(node *head,int dn)
{
if(dn>0&&dn<=n){
n--;
node *p,*pre;
pre=head;
p=head->next;
int count=1;
while(p){
if(count==dn){
pre->next=p->next;
delete(p);
p=NULL;
return 1;
}
count++;
pre=pre->next;
p=p->next;
}
}
return 0;
}
int main()
{
int t;
cin>>n;
node *head=new node;
head->next=NULL;
CreateList(head);//创建
ShowList(head);//输出
cin>>t;
while(t--){
int dn;
cin>>dn;
if(Deletelist(head,dn))//删除
ShowList(head);//输出
else
cout<<"error"<<endl;
}
return 0;
}