[英]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.