将链接列表排序为字母顺序

时间:2015-10-27 05:03:11

标签: c++

我无法从已排序的链接列表中删除节点。我从.txt文件中读入了73个不同的名称,这些名称必须按字母顺序排序。我有一个switch语句,应该可以对链表做5个单独的事情。目前我已经获得了1号和2号工作但不是3号工作。 #3希望我能够从链表中删除一个名字。在我输入要删除的名称后,我的代码将不会显示任何内容。因此我假设我遇到了deleteAfter函数的问题。谁能给我一个暗示为什么会这样呢?

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

struct node{
    string name;
    node *next;
};

node *A = NULL;

void addnode(string newname){
    node *add,
         *last,
         *current;

    add = new node;
    add->name = newname;

    if (A == NULL){
        add->next = A;
        A = add;
    }else{
        current = A;
        last    = A;
        while (current && current->name < newname){
            last = current;
            current = current->next;
        }

        if (current == A){
            /* Insert before 1st node */
            add->next = A;
            A = add;
        }
        else{
            /* Insert between last and current 
               or at the end of the list */
            last->next = add;
            add->next = current;
        }
    }
}
void deleteName(string name)
{
    node *curr;
    node *nextNode;
    curr = A;
    nextNode = curr;
    while(curr){
        if(curr -> next -> name == name){
            nextNode = curr -> next;
            curr -> next = nextNode -> next;
        }

    }


}



void display()
{
    node *curr;
    curr = A;
     while(curr){
        if(A == NULL){break;}
        cout << A->name << endl;
        A = A->next;
    }

}

int main(){


    int input, count;
    count = 0;
    ifstream dataFile;
    dataFile.open("Data.txt");
    string item;
    string name;
    while(dataFile)
    {
        dataFile >> item;
        addnode(item);
        count++;
    }




    cout << "1. Display the linked list\n";
    cout << "2. Display the length of the list\n";
    cout << "3. Delete name from the list\n";
    cout << "4. display the length of a section of the list\n";
    cout << "5. Print out section of list\n";
    cin >> input;

    switch (input)
    {
    case 1:
        display();
        break;
    case 2:
        cout << "There are " << count - 1 << " names in the list\n";
        break;
    case 3:
        cout << "Type in the name that you want to be deleted: ";
        cin >> name;
        deleteName(name);
        display();
        break;
    case 4:
        break;
    case 5:
        break;
    }


    system("PAUSE");
    return 0;

}

这是我到目前为止的代码。您会注意到,在我的main函数中,我从一个名为&#34; Data.txt&#34;的文件中读取输入。

joe
bob
harry
mary
brian
tom
jerry
bullwinkle
pam
ellis
dale
bill
barrack
george
gertrude
zack
zeus
apollo
gemini
greg
larry
meriam
webster
thomas
stewart
dianna
theresa
billyjoe
carl
karl
charles
karla
donna
tena
kerry
howard
johnson
ulyssess
paul
peter
issaac
marvin
dudz
chuck
ellie
anny
judy
matt
ross
dan
robert
kim
eric
junkun
ghassan
cris
raymond
avery
roy
halley
mitzee
ziggy
rocky
twirly
max
huey
dewy
hongkongfooey
clarence
lala
sammy
fred
francis

这是txt文档由^^组成的。任何建议将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

while (current && strcmp(current->name , newname) <=0){
    last = current;
    current = current->next;
}

试试这个。

答案 1 :(得分:0)

您正在访问下一个而不检查它是否为空,并且您没有在列表中进行迭代。另外你应该在找到之后中断(除非你想要删除所有实例,你应该删除节点,因为你会泄漏内存。而且,你不能删除第一个元素,因为你从来没有检查它。你可以在需要处理更改根节点时添加特定的检查。

if (A != nullptr && A->name == name)
{
    node *toBeDeleted = A;
    A = A->next;
    delete toBeDeleted;
    return;
}

while(curr && curr->next){
    if(curr->next->name == name){
        nextNode = curr->next;
        curr->next = nextNode->next;
        delete nextNode;
        break;
    }
    curr = curr->next;
}

当然,如果要删除名称的所有实例,则需要删除return和break语句。

您的显示功能也会清空列表。你需要设置curr,而不是A:

void display()
{
    node *curr;
    curr = A;
    while(curr){
       cout << curr->name << endl;
       curr = curr->next;
    }
}

答案 2 :(得分:0)

您正在使用链接列表数据结构。我发现奇怪的是你使用了一个循环。最后一个节点的下一个元素再次指向开头。

以下是根据您的知识和风格(我相信会看到)提出的deleteName

void deleteName(string name) {

    node *current = A;
    node *previous;

    while (current) {
        if (current->name == name) {
            previous->next = current->next;
            delete current;
            break;
        } else {
            previous = current;
            current = current->next;
        }
    }
}
相关问题