c언어 단순연결리스트 질문드립니다..

#include <stdio.h>
#include <stdlib.h>

typedef int element;
typedef struct ListNode {
	element data;
	struct ListNode *link;
}ListNode;

void error(char *message)
{
	fprintf(stderr, "%s\n", message);
	exit(1);
}

ListNode* insert_first(ListNode *head, int value)
{
	ListNode *p = (ListNode *)malloc(sizeof(ListNode));
	p->data = value;
	p->link = head;
	head= p;
	return head;
}

ListNode* insert(ListNode *head, ListNode *pre, element value)
{
	ListNode *p = (ListNode *)malloc(sizeof(ListNode));
	ListNode *temp;
		
	p->data=head;
	while(p->data < value)
	{
		temp=p;
		p=p->link;
	}pre=temp;
	
	p->data = value;
	p->link=pre->link;
	pre->link=p;
	return head;
}

ListNode* print_list(ListNode *head)
{
	for(ListNode *p=head; p != NULL; p=p->link)
	printf("%d->", p->data);
	printf("NULL \n");
}

int main(void)
{
	ListNode *head = NULL;
	ListNode *pre;


		head = insert_first(head,60);
		print_list(head);
		head = insert(head, pre, 80);
		print_list(head);
		head = insert(head, pre, 70);
		print_list(head);
return 0;
}

60 -> NULL
60 -> 80 -> NULL
60 -> 70 -> 80 -> NULL이 나와야하는데 안나오네요…
insert쪽의 while문이 틀린거 같은데… 어떻게 고쳐야하죠…?

안녕하세요.

정렬해서 넣나보군요.

는 왜 필요한건가요?

굳이 매개변수로 안전달해도 될거같은데여 ^^/

1 -> 2 -> 4 - > 5 -> N 이렇게 있으면,

3을 넣는다고 하면

1 -> (2) -> (4) - > 5 -> N

먼저 가장 첫번째 노드의 값보다 작은지 비교하고,

while문 안에서 p와 p->link의 data를 비교해서
p->data <= value < p->link->data 이렇게 된다면 p다음에 넣으면 대구요.
이러한 조건을 만족하지 않은채로 while문이 끝난다면,
마지막에 넣으면 대겠지요?

마지막 원소가 p가 될때, p->link가 null인 부분만 잘 처리해주시면 되겠지요~

1, main 함수에서 pre를 넘기지만, preinsert 함수 내에서 지역변수처럼 사용되고 있습니다.
인자로 넘기지 마시고, 지역변수를 사용하세요.
2. insert_first 함수는 어차피 처음으로 노드를 할당해서 그 노드를 리턴합니다. 인자로 head를 넘기실 필요가 없습니다.
3. insert_firstinsert를 작성자님이 의도하신대로 적절하게 작성하면 이렇게 됩니다.

ListNode* insert_first(int value)
{
    ListNode* head = (ListNode*)malloc(sizeof(ListNode));
    head->data = value;
    head->link = NULL;
    return head;
}

ListNode* insert(ListNode *head, element value)
{
    ListNode* pre = NULL;

    for (ListNode* p = head; p != NULL && p->data < value; p = p->link)
    {
        pre = temp;
        temp = temp->link;
    }

    if (pre == NULL)
    {
        pre = (ListNode*)malloc(sizeof(ListNode));
        pre->data = value;
        pre->link = head;
        return pre;
    }

    pre->link = (ListNode*)malloc(sizeof(ListNode));
    pre->link->data = value;
    pre->link->link  = NULL;
    return head;
}