训练赛20160406_华中OJ

Description
给出一个完整的句子,这个句子中不包含不可见字符或者空格,于是在这个句子中有许多不同的单词。一个单词是指一串连续的最长的英文字母(大写或小写)。例如”#abc#”中,”abc”就是一个单词,而”ab”,”bc”都不算单词。
Input
输入包含多组数据 输入数据第一行是一个句子,只包含可见字符(不包含空格)。句子长度不超过 100。
Output
按单词出现的顺序输出不同的单词。如果一个单词出现多次则只有第一次出现时输出。
Sample Input
Orz_YaYaMao_Orz_Daxia_Orz_EveryOne
Sample Output
Orz
YaYaMao
Daxia
EveryOne

明明是一道水题,用数组就可以很轻松解决的,我偏偏写了个链表,结果把自己写晕了。(刚学完就忘了,没记住-。-)还好最终还是写好了,要不真尼玛丢人。下面给出我写的链表代码(有错误请指出,我自己有点蒙逼)
思路:读取字符,遇到符号将之前读入的字符串储存在链表里,(写个二位数组也可以)最后输出

#include<iostream>
#include<cstring>

using namespace std;

class Node{
    public:
    string str;
    Node *next;
    Node(string ss){
        str = ss;
        next = NULL;
    }
};
class linklist{
    public:
        Node *head;
        int length;

        linklist(){
            head = NULL;
            length = 0;
        }

void insert(Node *node, int index) {
        if (head == NULL) {
            head = node;
            return;
        }
        if (index == 0) {
            node->next = head;
            head = node;
            return;
        }
        Node *current_node = head;
        int count = 0;
        while (current_node->next != NULL && count < index - 1) {
            current_node = current_node->next;
            count++;
        }
        if (count == index - 1) {
            node->next = current_node->next;
            current_node->next = node;
            length++;
        }
    }

        int search(Node *node){
            if(head == NULL){
                return 0;
            }
            Node *current_node = head;
            while(current_node!=NULL){
                if(current_node -> str == node -> str){
                    return 1;
                }
                else{
                    current_node = current_node ->next;
                }
            }
            return -1;
        }

        void output(){
            Node* current_node = head;
            while(current_node !=NULL){
                cout<<current_node -> str<<endl;
                current_node = current_node -> next;
            }
        }

};
int main(){
        char str[100];
        //linklist list();
        //int t;
        //cin>>t;
        while(cin>>str){
           // cin>>str;
            int strNum = 0,_str = 0;
            for(int i = 0; i< strlen(str); i++){
                if(isalpha(str[i])){
                    strNum++;
                }
                if(!isalpha(str[i])){
                    _str++;
                }
            }
            //cout<<strlen(str)<<" "<<strNum<<endl;
            if(strNum == strlen(str)){
                cout<<str<<endl;
            }

            else{
                linklist list;
                int count = 0;
                char temp[105];
                memset(temp,'\0',sizeof(temp));
                int j = 0;
                for(int i =0; i<strlen(str); i++){
                    if(isalpha(str[i])){
                       temp[j] = str[i];
                       j++;
                       }
                       if(isalpha(str[i]) && !isalpha(str[i+1])){
                        //cout<<temp<<endl;
                        string ss = temp;
                        //cout<<ss<<endl;
                        Node * node = new Node(ss);
                        if(list.search(node)<=0){
                          list.insert(node,count);
                          count++;
                        }
                        memset(temp,'\0',sizeof(temp));
                        j = 0;
                        }

                       }
                       list.output();
            }

        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值