单链表操作---建表,查找,删除

数据结构上机测试2-1:单链表操作A


Time Limit: 1000ms   Memory limit: 4096K  有疑问?点这里^_^

题目描述

输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。分别输出建立的初始单链表和完成删除后的单链表。

输入

第一行输入数据个数n;
第二行依次输入n个整数;
第三行输入欲删除数据m。

输出

第一行输出原始单链表的长度;
第二行依次输出原始单链表的数据;
第三行输出完成删除后的单链表长度;
第四行依次输出完成删除后的单链表数据。

示例输入

10
56 25 12 33 66 54 7 12 33 12
12

示例输出

10
56 25 12 33 66 54 7 12 33 12
7
56 25 33 66 54 7 33

#include<stdio.h>  
#include<stdlib.h>  
  
struct node  
{  
    int data;  
    struct node *next;  
};  
  
void del(struct node *head, int key, int n)  
    {  
        int i, count=0;  
        struct node *p, *q;  
        p = head;  
        while(p->next!=NULL)  
        {  
            if(p->next->data == key)  
            {  
                q = p->next;  
                p->next = q->next;  
                free(q);  
                count ++;  
            }  
            else  
                p = p->next;  
        }  
        printf("%d\n", n-count);  
        head = head->next;  
        for(i=0; i<n-count; i++)  
        {  
            printf("%d", head->data);  
            if(i<n-1)  
                printf(" ");  
            else  
                printf("\n");  
            head = head->next;  
        }  
    }  
  
int main()  
{  
    int n, i, key;  
    struct node *head, *tail, *p, *q;  
    head = (struct node *)malloc(sizeof(struct node));  
    head->next = NULL;  
    tail = head;  
    q = head;  
    scanf("%d", &n);  
    for(i=0; i<n; i++)  
    {  
        p = (struct node *)malloc(sizeof(struct node));  
        scanf("%d", &p->data);  
        p->next = NULL;  
        tail->next = p;  
        tail = p;  
    }  
    scanf("%d", &key);  
    printf("%d\n", n);//输出原单链表的长度  
                     //PS:wa了两次,原因没看清要输出原单链表的长度,一定要认真读题啊  
    q = q->next;  
    for(i=0; i<n; i++)//输出原单链表  
    {  
        printf("%d", q->data);  
        if(i<n-1)  
            printf(" ");  
        else  
            printf("\n");  
        q = q->next;  
    }  
  
    del(head, key, n);//完成删除key值,并输出  
  
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值