我需要帮助创建一个在链接的名称列表上执行冒泡排序的函数。感谢您的帮助。
#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的
卡门
科林
涡流
巴勃罗
拉蒙特
德克斯特
感谢您的帮助。
答案 0 :(得分:1)
您需要为所有这些名称预留空间,您可以使用strdup()
:
void push(Data **head, char *name){
Data *temp = malloc(sizeof(Data*));
temp->name = strdup(name); /* here */
temp->next = *head;
*head = temp;
}
或malloc
和strcpy
:
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是检测此类问题的绝佳工具。