我需要帮助创建一个对名称链表进行冒泡排序的函数。提前感谢您的帮助。
#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 Sortn");
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,它看起来像这样:
德里克德鲁Randell
特雷卡门科林
艾迪Pablo拉蒙特
德克斯特
提前感谢您的帮助
您需要为所有这些名称保留空间,您可以使用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是检测此类问题的优秀工具。