단순 연결 리스트가 오류가 납니다.

익명 사용자의 이미지

연결 리스트를 공부하는 중인데 딱히 틀린게 느껴지지 않는데 번호와 name을 입력 받고나면 while문이 돌지 않고 실행이 종료 됩니다. 무엇이 문제인가요?

#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct nodeType {
	int num;
	char* name;
	nodeType* pre;
};
int main(){
	int num;
	char* name;
	nodeType* newnode;
	nodeType* head;
	nodeType* cur;
	nodeType* prenode;
	head=NULL;
	printf("노드구조의 번호:");
	scanf("%d",&num);
	while(num!=0){
		printf("\n이름: ");
		scanf("%s",name);
		newnode=(nodeType*)malloc(sizeof(nodeType*));
		newnode->num=num;
		newnode->name=name;
		newnode->pre=NULL;
		if(head==NULL){
			head=newnode;
		}
		else{
			cur=head;
			while(cur!=NULL){
				prenode=cur;
				cur=cur->pre;
			}
			prenode->pre=newnode;
		}
		printf("success");
	}
}

그리고 while문이 끝나면 모든 노드를 출력하고 싶은데 어떻게 코딩을 해야할까요...
작성자의 이미지

#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct nodeType {
	int num;
	char* name;
	nodeType* pre;
};
int main(){
	int num;
	char* name;
	nodeType* newnode;
	nodeType* head;
	nodeType* cur;
	nodeType* prenode;
	head=NULL;
	printf("노드구조의 번호:");
	scanf("%d",&num);
	while(num!=0){
		printf("\n이름: ");
		scanf("%s",name);
		newnode=(nodeType*)malloc(sizeof(nodeType*));
		newnode->num=num;
		newnode->name=name;
		newnode->pre=NULL;
		if(head==NULL){
			head=newnode;
		}
		else{
			cur=head;
			while(cur!=NULL){
				prenode=cur;
				cur=cur->pre;
			}
			prenode->pre=newnode;
		}
	printf("노드구조의 번호:");
	scanf("%d",&num);	
	}
 
	printf("success");
}

이게 진짜 코드 입니다.
세벌의 이미지

kldp 회원 로그인해서 글 쓰면 좋은 점. 내가 쓴 글은 내가 고칠 수 있다.
아래 코드에서 또 틀린 점은 없나요? 저는 그냥 복붙만 하고 코드 태그에 language=c 한 거라..

#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct nodeType {
	int num;
	char* name;
	nodeType* pre;
};
int main(){
	int num;
	char* name;
	nodeType* newnode;
	nodeType* head;
	nodeType* cur;
	nodeType* prenode;
	head=NULL;
	printf("노드구조의 번호:");
	scanf("%d",&num);
	while(num!=0){
		printf("\n이름: ");
		scanf("%s",name);
		newnode=(nodeType*)malloc(sizeof(nodeType*));
		newnode->num=num;
		newnode->name=name;
		newnode->pre=NULL;
		if(head==NULL){
			head=newnode;
		}
		else{
			cur=head;
			while(cur!=NULL){
				prenode=cur;
				cur=cur->pre;
			}
			prenode->pre=newnode;
		}
	printf("노드구조의 번호:");
	scanf("%d",&num);	
	}
 
	printf("success");
}

num!=0 인 동안 while 문이 돌기를 바라는 거죠?
그 바로 전에 num 값을 찍어보셔요.

익명 사용자의 이미지

늘 비슷비슷한 질문이 올라오는군요. 머지않아 어지간한 질문은 링크만으로 답할 수 있겠어요.

Quote:
연결 리스트를 공부하는 중인데 딱히 틀린게 느껴지지 않는데 번호와 name을 입력 받고나면 while문이 돌지 않고 실행이 종료 됩니다. 무엇이 문제인가요?

>>> 코드 여러 군데에서 문제가 보입니다만, "딱히 틀린게 느껴지지 않는데" 부분이 가장 심각하군요.

누구나 실수는 할 수 있는 거지만, 자기 코드가 무슨 일을 하고 있는지 스스로 읽지 못하고 있다면 조금 문제가 있다고 봐야 합니다.

코드의 main 함수에서 변수 name이 언급되는 곳을 처음부터 검색해 볼까요?

char* name; // (초기화 안 됨)
scanf("%s",name); // 초기화 안 된 포인터 name이 가리키는 곳으로 입력을 받다니?

누울 자리를 보고 다리를 뻗으라 하였습니다. 문자열을 입력받으려면 문자열 입력을 받을 자리를 미리 마련해야지요.
char * 타입 포인터를 만드는 것으로는 충분치 않습니다. 지역변수로든 동적 할당으로든 문자 배열이 있어야 합니다.

최근에 비슷한 종류의 실수를 하신 분이 있는데 참고해 보시고요: https://kldp.org/node/161753

그 밖에도 아래 코드 라인에도 문제가 있으니 다시 잘 읽고 생각해보시기 바랍니다. 이것도 초보자들이 많이 저지르는 실수인데, 개인적으로 이 실수를 막기 위해서라도 C++의 new 문법이 더 좋은 것 같습니다.

newnode=(nodeType*)malloc(sizeof(nodeType*));

Quote:
그리고 while문이 끝나면 모든 노드를 출력하고 싶은데 어떻게 코딩을 해야할까요...

맞춤형 코드 주문인가요? 얼마까지 알아보고 오셨나요?

예시를 보고 싶으시거나 직접 공부해서 해 보고 싶으시면 linked list traversal로 검색하면 많이 나올겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.