簡體   English   中英

單鏈表,基於*char輸入的自排序

[英]Single linked list, self sorting based on *char input

我花了大量時間在這上面,我終於讓它工作了(因為它保存了值並打印了它們)。 我想按字母順序對計數器進行排序。 如果我將這些值添加到我的列表中,它們不會以我添加它們的相同順序打印出來,但它似乎有點隨機......似乎 strcpy 並沒有以我想象的方式工作。 ..

#include <iostream>
#include <cstdlib>
#include <string.h>
#include <stdio.h>
using namespace std;


typedef struct list list_t;
struct list{
    list *next;
    char *nam;
    int age;

};

static list_t *top = NULL;


void add_value(char * name1, int age){
    list * neww = (list_t*)malloc(sizeof( list_t));
    //tmp = top;
    neww->age = age;
    neww->nam = (char*)malloc(strlen(name1) + 1);
    neww->next = NULL;
    strcpy(neww->nam, name1);
    list * tmp = (list_t*)malloc(sizeof(list_t));
    tmp = top;
    if (tmp==NULL){
        top = neww;
        //printf("%s\n", top->nam);
    }else
    while (1){


        if (tmp->next == NULL){
            tmp->next = neww;
            break;
        }
        //printf("top - %s %d\n neww - %s %d\n tmp - %s %d", top->nam, top->age, neww->nam, neww->age, tmp->nam, tmp->age);
        if (strcmp(neww->nam, tmp->nam)>=0){
            neww->next = tmp->next;
            tmp->next = neww;
            break;
        }

        tmp = tmp->next;


    }

}


void print(){
    list * tmp = (struct list*)malloc(sizeof(struct list));
    tmp = top;
    while (tmp){
        printf("%s %d\n", tmp->nam, tmp->age);
        tmp = tmp->next;

    }


}


int main(){

    char namee[100];
    int age;
    for (int i = 0; i < 5; i++){
        scanf("%s %d", &namee, &age);
        add_value(namee, age);
    }

    print();

    return 0;
}

我發現了兩件事似乎是錯誤的。

a) 這條線

list * tmp = (struct list*)malloc(sizeof(struct list));

是錯誤的(在兩個函數中使用)。 您需要一個指針 - 而不是一個新元素 - 所以不需要malloc

b) 此代碼

    if (tmp->next == NULL){
        tmp->next = neww;
        break;
    }

當您到達最后一個元素時,它似乎變得活躍。 但是,您仍然必須檢查新元素是要插入到列表中已有的元素之前還是之后。 您的代碼總是將新元素放在后面。 考慮您的列表只有 1 個元素的情況。

順便說一句 - 如果你想寫 C++,你應該使用std::string而不是 c 風格的 char 數組。 另外,看看std::multimap而不是你自己的鏈表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM