포인터, 함수의 매개변수로 전달
안녕하세요.
c언어를 배우는 중에 있습니다.
연결리스트로 큐를 만드는데, 선언한 구조체 포인터 변수를 함수의 매개변수로 넘겨 함수내에서 조작하려고 합니다.
head와 tail을 NULL로 초기화한 다음에 큐에 넣기 위해 addq를 합니다.
addq에서 큐가 공백이면(head==NULL) head->data에 값을 넣는 것으로 진행되는데,
5번의 인큐를 수행할 때 모두 head가 NULL로 인식되어 first node라고 출력됩니다.
원래 시나리오는 처음에만 (큐가 공백일 때) head가 NULL이어 head에 바로 newNode가 대입되게 하고
두번 째 부터는 tail과 newNode를 연결하는 것이 되어야 합니다..
분명히 제가 잘못하여 정상적인 진행이 이루어지지 않는 것 같은데
천천히 생각해보아도 왜 그런지 모르겠습니다. 잘못된 부분을 가르쳐주시면 감사하겠습니다..
#include
#include
typedef struct Node {
int data;
struct Node *next;
} Node;
void addq(struct Node *head, struct Node *tail, int data);
int deleteq(struct Node *head, struct Node *tail);
int main()
{
Node *head = (Node *)malloc(sizeof(Node));
Node *tail = (Node *)malloc(sizeof(Node));
/* init */
head = NULL;
tail = NULL;
addq(head, tail, 1);
addq(head, tail, 2);
addq(head, tail, 3);
addq(head, tail, 4);
addq(head, tail, 5);
}
void addq(struct Node *head, struct Node *tail, int data)
{
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
printf("n->d:%d, n->n:%d\n", newNode->data, newNode->next);
if(newNode == NULL)
return;
if (head == NULL) {
head = newNode;
tail = newNode;
printf("first node\n");
} else {
tail->next = newNode;
tail = newNode;
printf("not first node\n");
}
}
아마도...
void addq 에서 struct Node *head, struct Node *tail를 ** 포인터의 포인터로 바꿔 줘야 될것입니다.
struct Node *로 하면 포인터의 복사본만 패스됩니다.
댓글 달아주셔서 감사합니다.
말씀해주신 대로 해보니
queue.c: In function ‘main’:
queue.c:28:2: warning: passing argument 1 of ‘addq’ from incompatible pointer type [enabled by default]
addq(head, tail, 1);
^
queue.c:10:6: note: expected ‘struct Node **’ but argument is of type ‘struct Node *’
void addq(struct Node **head, struct Node **tail, int data);
^
queue.c:28:2: warning: passing argument 2 of ‘addq’ from incompatible pointer type [enabled by default]
addq(head, tail, 1); .. .. .. (일부 생략, 너무 길어서..)
이런 워닝이 생기고, 억지로 실행하니 segmentation fault를 뱉어냅니다..
약간의 수정...그것만 고칠게 아니라...
더 고치셔야죠.
결과 출력
n->d:1, n->n:00000000
first node
n->d:2, n->n:00000000
not first node
n->d:3, n->n:00000000
not first node
n->d:4, n->n:00000000
not first node
n->d:5, n->n:00000000
not first node
1 --> 2 --> 3 --> 4 --> 5 --> end
아하...감사합니다.
더 고치긴 했습니다만, 전달하는 부분을 고치고
함수내부에서는 각각의 head랑 tail앞에 &를 붙였었는데
제가 잘못고쳤습니다.
귀한시간 내주셔서 답변해주심에 감사드립니다.
참고해보세요. 연결리스트 예제소스
- 무조건 추가로 입력되는 노드는 tail 꼬리입니다.
- 구조체 값을 함수에서 referece 참조하는 방법을 몰라서 리턴값으로 구현해봤습니다.
- 전체 출력을 위해서. 맨 처음에 생성한 Node 주소를 head로 사용했습니다.
이와는 별도로.
이중 연결리스트 예제소스를 파일로 첨부합니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
감사합니다!
리턴값을 이용한 방법을 제시해 주셔서 감사합니다.
추가로.. 예제까지 첨부해주셔서 더 감사합니다.
댓글 달기