单链表(带头结点)的删除

题目描述

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;
}

猜你喜欢

转载自blog.csdn.net/zzzzhdx/article/details/79509419