연결리스트 위치 바꿀때 질문입니다. 고수분들 도와주세요!..

Sift의 이미지

제가 학교 공부를 하는중 연결리스트에 대해 배우고 있습니다.
버블정렬을 하는데 제가 리스트간의 위치를 스왑하고 싶어서 계속 해본뒤에
아래와같이 되었는데 저런식으로 스왑을 해도 되는지 맞는지 궁금해서 질문 올립니다.

SwapNode라는 함수는 바꾸고싶은 노드 두개를 받은뒤
두개의 노드속에 있는 내용들을 전부 스왑하고 다음노드를 가르키는 값을 서로 또 바꿔주는식입니다.

1 2 3 4 (주소)
A-B-C-D 중 D와 A를 바꿀때

1 2 3 4 (주소)
D-B-C-A 로 바뀌고

C는 원래 Next로 4를 가리키고 있었으므로 바뀔 필요가 없고 B또한 그렇습니다.
결국 바뀌어야 하는것은 D와 A가 가르키는 Next인데 D는 NULL을 가르키고 있을것이므로 만약 바꾸지않고 실행하면
D를 출력하고 바로 꺼지므로 D와 A가 가르키던 주소를 서로 바꿔줍니다
그렇게되서 D는 A가 가르키던 Next 즉 2를 가르키게되고 A는 D가 가르키던 Next 4를 가르키게되어 출력하면
D출력 -> B출력 이런식인데

제가 아래처럼 만든것이 위의 설명과 맞는지 알고싶습니다.

요약하자면 아래의 코드가 잘 되기는 하는데
스왑할때 아래처럼 했을시 내용이 모두 바뀌는것인지 아니면
두개 사이의 주소값만 스왑되는것인지 모르겠습니다.
주소값만 스왑되는거라고 한다면 왜굳이 동적할당으로 메모리 할당을 해야하는지 몰라서 그렇습니다.

또! 한번 봐주실때 아래처럼 연결 리스트를 사용해도 되는것인지와
이렇게짰으면 더 좋겠다! 개선방안이나 스왑하지 않고 노드를 정렬하는방법등, 고수님들의 코딩방식과 더좋은길을 알고싶습니다.

아래는 학번을 받아 연결리스트에 저장하고 평균순으로 정렬하는 프로그램입니다.

//data.txt 파일값
20074242 62 75 73
20081234 99 60 87
20074243 55 83 67
20067044 100 100 70

// 아래는 코드입니다.

#include<stdio.h>
#include<Windows.h>
 
struct Node
{
	int Number;
	int KScore;
	int EScore;
	int MScore;
	int TotalScore;
	double AverageScore;
 
	struct Node *Next;
};
 
typedef struct Node Node;
 
Node *head;
 
void HeadMake()
{
	head = (Node*)malloc(sizeof(Node));
	head->Next = NULL;
}
 
void SwapNode(Node *N1,Node *N2)
{
	Node *Swap;
	Swap = (Node*)malloc(sizeof(Node));
 
	*Swap = *N1;
	*N1 = *N2;
	*N2 = *Swap;
 
	N2->Next = N1->Next;
	N1->Next = Swap->Next;
	free(Swap);
}
 
void SortingNode(void)
{
	Node *Temp,*Standard;
	Standard = head;
 
	while(Standard->Next != NULL)
	{
		Temp = Standard;
		while(Temp->Next != NULL)
		{
			if(Standard->TotalScore < Temp->TotalScore)
			{
				SwapNode(Standard,Temp);
			}
			Temp = Temp->Next;
		}
		Standard = Standard->Next;
	}
}
 
Node* InsertNode(Node *Temp)
{
	Node *NewNode;
	NewNode = (Node*)malloc(sizeof(Node));
	NewNode->Next = Temp->Next;
	Temp->Next = NewNode;
 
	return NewNode;
}
 
void DeleteNode(Node *Temp)
{
	Node *DeleteNode;
	DeleteNode = Temp->Next;
 
	if(DeleteNode!=0)
	{
		Temp->Next = DeleteNode->Next;
		free(DeleteNode);
	}
}
 
int main()
{
	int Fdata;
	FILE *fp;
 
	Node *Temp;
	HeadMake();
 
	fp = fopen("data.txt","r");
 
	Temp = head;
 
	while(fscanf(fp,"%d",&Fdata)!=EOF)
	{
		Temp->Number = Fdata;
		fscanf(fp,"%d",&Temp->KScore);
		fscanf(fp,"%d",&Temp->EScore);
		fscanf(fp,"%d",&Temp->MScore);
		Temp->TotalScore = Temp->KScore + Temp->EScore + Temp->MScore;
		Temp->AverageScore = (double)(Temp->TotalScore) / 3.0;
 
		Temp = InsertNode(Temp);
	}
 
	Temp = head;
 
	printf("Before Sorting!!\n");
	printf("학번\t\t국어\t영어\t수학\t총점\t평균\n");
	while(Temp->Next != 0)
	{
		printf("%d\t%d\t%d\t%d\t%d\t%.2lf\n",Temp->Number,Temp->KScore,Temp->EScore,Temp->MScore,Temp->TotalScore,Temp->AverageScore);
		Temp = Temp->Next;
	}
 
	SortingNode();
 
	Temp = head;
 
	printf("\n\n\nAfter Sorting!!\n");
	printf("학번\t\t국어\t영어\t수학\t총점\t평균\n");
	while(Temp->Next != 0)
	{
		printf("%d\t%d\t%d\t%d\t%d\t%.2lf\n",Temp->Number,Temp->KScore,Temp->EScore,Temp->MScore,Temp->TotalScore,Temp->AverageScore);
		Temp = Temp->Next;
	}
 
	fclose(fp);
	system("pause");
	return 0;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.