如何冒泡排序名称的链接列表?

时间:2014-07-08 18:41:30

标签: c string linked-list scanf bubble-sort

我需要帮助创建一个在链接的名称列表上执行冒泡排序的函数。感谢您的帮助。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define MAX_STR_LEN 25

typedef struct Data_ {
    char *name;
    struct Data_ *next;
}Data;

Data* bubble_sort(Data *list);
Data* read_from_file(const char* file, const int size);
void display(Data *list);
void push(Data **head, char *name);

int main(int argc, char **argv){

    if(argc != 2){
            printf("Not enough parameters!");
            exit(0);
    }

    Data *head = NULL;

    int size = 10;
    head = read_from_file(argv[1], size);

    printf("\nBubble Sort\n");

    head = bubble_sort(head);
    display(head);
}

Data *bubble_sort(Data *list){



}
void push(Data **head, char *name){

    Data *temp = malloc(sizeof(Data*));
    temp->name = name;
    temp->next = *head;
    *head = temp;

}

Data* read_from_file(const char* file, const int size){

    FILE *input;
    input = fopen(file, "r");
    Data *new_ = (Data*)malloc(sizeof(Data*));
    new_->next = NULL;

    int i;
    char name[MAX_STR_LEN];
    for(i = 0; i < size; i++){
    fscanf(input, "%25s", &name);
    push(&new_, name);
    }

return new_;
}

void display(Data *list){

    Data *current = list;
    while(current){
            printf("\n%s", current->name);
            current = current->next;
    }
}

我想要读入的名称文件名为names.txt,它看起来像这样:

德里克

德鲁

兰德尔

Terrell的

卡门

科林

涡流

巴勃罗

拉​​蒙特

德克斯特

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要为所有这些名称预留空间,您可以使用strdup()

void push(Data **head, char *name){
    Data *temp = malloc(sizeof(Data*));
    temp->name = strdup(name); /* here */
    temp->next = *head;
    *head = temp;
}

mallocstrcpy

void push(Data **head, char *name){
     Data *temp = malloc(sizeof(Data*));
     temp->name = malloc(strlen(name) + 1);
     strcpy(temp->name, name);
     temp->next = *head;
     *head = temp;
}

不要忘记最后free

另请注意,您传递的错误尺寸为malloc

Data *temp = malloc(sizeof(Data*));

必须

Data *temp = malloc(sizeof(Data));

Data *temp = malloc(sizeof(*temp));

如果您使用某些unix,valgrind和gdb是检测此类问题的绝佳工具。