zoukankan      html  css  js  c++  java
  • 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

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

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。

    输入

    第一行输入元素个数n;
    第二行输入n个整数。

    输出

    第一行输出初始链表元素个数;
    第二行输出按照逆位序所建立的初始链表;
    第三行输出删除重复元素后的单链表元素个数;
    第四行输出删除重复元素后的单链表。

    示例输入

    10
    21 30 14 55 32 63 11 30 55 30

    示例输出

    10
    30 55 30 11 63 32 55 14 30 21
    7
    30 55 11 63 32 14 21

    代码(好搓~~~啊~~~,凑和着看吧):
    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <string.h>
    #include <algorithm>
    #include <ctype.h>
    
    using namespace std;
    
    struct node
    {
        int data;
        struct node *next;
    };
    
    struct node *nicreat(int n) //逆序创建链表
    {
        int i;
        struct node *head, *p;
        head = new node;
        head->next = NULL;
    
        for(i=0; i<n; i++)
        {
            p=new node;
            cin>>p->data;
            p->next=head->next;
            head->next=p;
        }
        return head;
    }
    
    
    int main()
    {
        int n;
        cin>>n;
        int i, j;
        int len;
        struct node *head, *w, *q;
        struct node *h1, *p, *tail, *dd;
    
        head=nicreat(n);
        cout<<n<<endl;
        w=head->next;
    
        for(i=0; i<n; i++)
        {
            if(i==0)
              cout<<w->data;
            else
              cout<<" "<<w->data;
            w=w->next;
        }
        cout<<endl;
    //删除重复元素,重复的保留最前面的
    
        h1=new node;
        h1->next=NULL;
        tail=h1;
        len=0;
    
        w=head->next;
        delete(head);
    
        for(i=0; i<n; i++)
        {
            if(h1->next==NULL) //此时链表为空
            {
                p=new node;
                p->data = w->data;
                p->next=NULL;
                tail->next=p;
                tail=p;
                len++;
                q=w;
                w=w->next;
                delete(q); //将原链表的节点删除
            }
            else //若不为空
            {
               dd=h1->next;
               int ff=1;
               for(j=0; j<len; j++) //检查是否出现过
               {
                   if(dd->data == w->data )
                   {
                       ff=0;
                       break;
                   }
                   dd=dd->next;
               }
               if(ff==1 )//没出现过
               {
                   p=new node;
                   p->data = w->data;
                   p->next=NULL;
    
                   tail->next=p;
                   tail=p;
                   len++;
                   q=w;
                   w=w->next;
                   delete(q);
               }
               else if(ff==0 )
               {
                   w=w->next;
               }
            }
            //w=w->next;
        }
        cout<<len<<endl;
        w=h1->next;
        for(int k=0; k<len; k++)
        {
            if(k==0)
              cout<<w->data;
            else
              cout<<" "<<w->data;
            w=w->next;
        }
        cout<<endl;
    
        return 0;
    }
    
  • 相关阅读:
    网页如何展示PPT文档
    关于DLL中Resources文件修改
    解決 IE10 浏览器无法使用 ASP.NET From 验证登录的问题
    Ubuntu 13.10 下安装 eclipse
    Ubuntu 13.10 下安装node
    关于AutoCAD.NET的辅助方法
    Linux下安装oracle11g
    Linux下配置VNC
    Linux下安装McAfee防病毒软件(企业版本)
    .net 下word 中的图片与文字分离
  • 原文地址:https://www.cnblogs.com/yspworld/p/4094314.html
Copyright © 2011-2022 走看看