zoukankan      html  css  js  c++  java
  • 删除数组中的元素【指针练习,尾插法】

    题目链接:http://ica.openjudge.cn/struct/2/

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    给定N个整数,将这些整数中与M相等的删除 
    假定给出的整数序列为:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3 
    应该将其放在一个链表中,链表长度为20 
    要删除的数是3,删除以后,链表中只剩14个元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9

    要求:必须使用链表,不允许使用数组,也不允许不删除元素直接输出 
          程序中必须有链表的相关操作:建立链表,删除元素,输出删除后链表中元素,释放链表 
          不符合要求的程序即使通过,也会算作0分 

    输入
    输入包含3行:
    第一行是一个整数n(1 <= n <= 200000),代表数组中元素的个数。
    第二行包含n个整数,代表数组中的n个元素。每个整数之间用空格分隔;每个整数的取值在32位有符号整数范围以内。
    第三行是一个整数k,代表待删除元素的值(k的取值也在32位有符号整数范围内)。
    输出
    输出只有1行:
    将数组内所有待删除元素删除以后,输出数组内的剩余元素的值,每个整数之间用空格分隔。
    样例输入
    20
    1 3 3 0 -3 5 6 8 3 10 22 -1 3 5 11 20 100 3 9 3
    3
    样例输出
    1 0 -3 5 6 8 10 22 -1 5 11 20 100 9

    偷懒的数组代码:

     1 #include <stdio.h>
     2 int main(int argc, char *argv[])
     3 {
     4     int n,a[200005],k,i;
     5     scanf("%d",&n);
     6     for(i=0;i<n;i++)
     7     {
     8         scanf("%d",&a[i]);
     9     }
    10     scanf("%d",&k);
    11     for(i=0;i<n;i++)
    12     {
    13         if(a[i]!=k) printf("%d ",a[i]);
    14     }
    15     return 0;
    16 }

    学习角度出发写的链表代码:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 struct obj
     4 {
     5     int num;
     6     struct obj *next;
     7 };
     8 int main(int argc, char *argv[])
     9 {
    10     int n,k,i,t;
    11     struct obj *head=NULL,*end=NULL,*temp=NULL,*p=NULL,*q=NULL;
    12     
    13     freopen("data.in","r",stdin);
    14     
    15     scanf("%d",&n);
    16     for(i=0;i<n;i++)//尾插法创建链表 
    17     {
    18         scanf("%d",&t);
    19         temp=(struct obj*)malloc(sizeof(struct obj));
    20         temp->num=t;
    21         temp->next=NULL;
    22         
    23         if(i==0)
    24             head=end=temp;
    25         else
    26         {
    27             end->next=temp;
    28             end=temp;
    29         }
    30     }
    31     scanf("%d",&k);
    32     
    33     //输出链表 
    34     /*p=head;
    35     while(p!=NULL)
    36     {
    37         printf("%d ",p->num);
    38         p=p->next;
    39     }
    40     printf("
    ");*/
    41     
    42     //可能要删除的数是第一个 
    43     while(head!=NULL&&head->num==k)
    44     {
    45         p=head;
    46         head=head->next;
    47         free(p);
    48     }
    49     //下面扫描链表中间寻找需要删除的数 
    50     q=head;
    51     p=head->next;
    52     while(p!=NULL)
    53     {
    54         if(p->num==k)//删除p结点 
    55         {
    56             q->next=p->next;
    57             free(p);
    58             p=q->next;
    59         }
    60         else//q和p往后挪一个结点 
    61         {
    62             q=p;
    63             p=p->next;
    64         }
    65     }
    66     
    67     //输出并释放链表
    68     p=head;
    69     while(p!=NULL)
    70     {
    71         printf("%d ",p->num);
    72         q=p;
    73         p=p->next;
    74         free(q);
    75     }
    76     printf("
    ");
    77     return 0;
    78 }
  • 相关阅读:
    (转)很简短,但读完你会感触良多!
    (转)让 win8 快速通过认证的5个提示
    WPF 资源路径解析
    47、SimpleOrientationSensor
    45、SplashScreen
    让IE6也支持position:fixed
    utf8编码引起js输出中文乱码的解决办法(实用)
    javascript的currying函数
    sicily 1036. Crypto Columns
    sicily 6774. Buying Mortadella
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7246071.html
Copyright © 2011-2022 走看看