어떻게 데이터를 복사하지 않고 포인터를 사용할 수 있습니까? 거품 정렬 함수를 작성하고 싶지만 막혔습니다. 값 대신 노드 주소를 바꿀 수있는 방법이 필요합니다. 나는 도시의 이름 및 온도를 가진 파일이 있습니다데이터를 스와핑하지 않고 링크 된 목록의 노드 스왑
- 라스 베이거스, 25
- 뉴욕, 33
- 시카고, 23
- 휴스턴, 39
을 내가 필요 온도에 따라 분류하고 다른 파일에 쓰십시오.
UPDATE : 좋아, 지금은 내가 theoratical 부분을 이해 생각 :
// 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;
이 내가 노드를 교체하기 위해해야 할 일이지만, 구문 내가 그것을 작동하게 couldnt한다. 싱글 링크드리스트에 두 개의 노드를 교환하기 위해
#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'와 같은 경우를 고려해야합니다. – dbush
'...} * head;'주의 : head는 초기화되지 않았다. – wildplasser
@wildplasser 정적 저장 기간이있는 변수로 초기화됩니다. –