【发布时间】:2017-12-11 21:44:15
【问题描述】:
如何在不复制数据的情况下使用指针? 我想写一个冒泡排序函数,但我卡住了,需要一些帮助如何交换节点地址而不是值。 我有一个包含城市名称和温度的文件:
- 拉斯维加斯,25
- 纽约,33
- 芝加哥,23
- 休斯顿,39
我需要按温度对其进行排序,然后将其写入另一个文件。
更新: 好的,现在我想我理解了理论部分:
// p is my node
// p-prev -> p -> p-next -> p-next-next
prev->next = p->next;
p->next = p->next->next;
prev->next->next = p;
这是我需要做的,交换节点,但在语法上我无法让它工作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char name[128];
int id;
struct node *next;
}*head;
void readFile() {
char fnamer[128] = "";
printf("\nEnter the file name to read (delimiter: ,): \n");
scanf("%s",&fnamer);
FILE *inf = fopen(fnamer, "r");
char buffer[1024];
memset(buffer, 0, 1024);
while(fgets(buffer, 1024, inf)){
struct node *temp = malloc(sizeof(struct node));
temp->next = NULL;
if(sscanf(buffer, "%19[^,], %d", temp->name, &temp->id) != 2){
free(temp);
break;
}
if(!head){
head = temp;
} else{
temp->next = head;
head = temp;
}
}
fclose(inf);
}
int main(void) {
// Read a linked list from file
readFile();
//Bubble sort in linked list
struct node *loop1 = head;
while(loop1){
struct node *loop2 = loop1->next;
while(loop2){
if(loop1->id > loop2->id){
// Swap next pointers
// This is not working
struct node *temp = loop1->next;
loop1->next = loop2->next;
loop2->next = temp;
}
loop2 = loop2->next;
}
loop1 = loop1->next;
}
// Print the sorted linked list to file:
char foutname[100]="";
printf("\nPlease Enter the file name to write the result: \n");
scanf("%s",&foutname);
FILE *outf;
outf = fopen(foutname, "w+");
loop1 = head;
while(loop1){
printf("%s %d\n", loop1->name, loop1->id);
fprintf(outf, "%s %d\n", loop1->name, loop1->id);
loop1 = loop1->next;
}
fclose(outf);
return 0;
}
【问题讨论】:
-
您需要跟踪
loop1和loop2的前一个节点,并在loop1和loop2的下一个指针之外交换它们的下一个指针。您还需要考虑loop1->next与loop2相同的情况。 -
... }*head;注意:head 未初始化。 -
@wildplasser 被初始化为一个静态存储时长的变量。
标签: c sorting linked-list bubble-sort