c언어 단순연결리스트 질문
조회수 996회
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *link;
}node; //노드 타입 정의
void makeList(node **); // 리스트 생성 함수. 전달인자: 헤더 포인터의 포인터
void viewList(node *); // 리스트 출력 함수
node * findLast(node *); /* 리스트 마지막 노드를 찾는 함수로 그 노드의 포인터 리턴
전달인자 : 헤더 포인터 값 */
int findPosition(node *, node **, node **, int);
/* 입력 데이터와 같은 데이터를 포함하는 노드의 포인터 및 그 이전 노드의 포인터를 찾는 함수.
전달인자: 헤더포인터, 이전노드 포인터, 타깃 포인터, 찾기 원하는 데이터 */
void insertList(node **, node *, int);
/* 리스트 삽입함수 전달인자: 헤터 포인터의 포인터, 타깃 포인터, 삽입데이터 */
void deleteList(node **, node *, node *);
/* 리스트 삭제함수 전달인자: 헤더 포인터의 포인터, 이전포인터, 타깃포인터 */
void main() {
node *head = NULL;
node *pre = NULL;
node *targetPtr = NULL;
int newData, target;
int found;
// 노드 생성
makeList(&head);
// 생성된 리스트 출력
viewList(head);
fflush(stdin);
// 데이터 삽입
printf("Enter data to insert :\n");
scanf_s("%d", &newData);
printf("어디 다음에 삽입할까요 : < 첫음에 입력을 원하면 -1 입력>\n");
scanf_s("%d", &target);
if (target == -1) {
targetPtr == NULL;
insertList(&head, targetPtr, newData);
}
else {
found = 0;
found = findPosition(head, &pre, &targetPtr, target);
if (found == 1)
insertList(&head, targetPtr, newData);
else
printf("There is no %d in the list\n", target);
}
viewList(head);
// delete list
printf("Enter data to delete from list\n");
scanf_s("%d", &target);
printf("targeted data is %d\n", target);
found = 0;
found = findPosition(head, &pre, &targetPtr, target);
printf("data is %d in the list", found);
printf("found data is %d\n", targetPtr->data);
if (found == 1)
deleteList(&head, pre, targetPtr);
else
printf("There is no %d in the list\n", target);
// View list data
viewList(head);
}
node * findLast(node *hptr) {
if (hptr != NULL) { hptr = hptr->link; findLast(hptr); }//만약 헤더가 널이 아니면 마지막 노드까지 포인터 이동//
return hptr;//리턴 hptr
}
int findPosition(node *hptr, node ** pre, node **targetPtr, int data) {
*pre = NULL;
*targetPtr = NULL;
while (hptr != NULL && hptr->data != data) { //hptr값이 널이 아니고 hptr->data값이 찾는 데이터가 아닐동안
*pre = hptr;//*pre값 = hptr값
hptr = hptr->link;//hptr은 다음 노드로 이동
if (hptr->data == data) {//만약 hptr->data와 data의 값이 같으면
*targetPtr = hptr;//*targetPtr값 = hptr
return 1;
}//리턴 1
else {
return 0;
}//그렇지 않으면
//리턴 0
}
}
void insertList(node **hptr, node *pptr, int data) {
node * new;
new->data = data; new->link = NULL;//새로운 노드 생성
if (*hptr == NULL) {//만약 *hptr 값이 널이면 현재 empty 이므로
*hptr = new->link;//*hptr이 new를 가리키게 함
}
else if (pptr == NULL) {//만약 pptr값이 널이면 처음에 입력해야 함으로
new->link = *hptr;//새로운 노드의링크, 즉 new->link는 *hptr값으로 함
*hptr = new;
}
else {//그렇지 않다면, 즉 리스트 중간에 삽입해야 함으로
new->link = pptr->link;//new->link 의 값은 pptr의 링크 값이며
pptr->link = new;//pptr->link 는 new의 값으로 함
}
}
void deleteList(node **hptr, node *pre, node *target) {
if (pre == NULL) {
*hptr = target->link;
}
else {
pre->link = target->link;
}
free(target);
}
void makeList(node **hptr) {
node *pre = NULL;
node *new = NULL;
int data;
findLast(node *pre);//findLast를 이용하여 리스트 마지막 노드 포인터값을 pre에 저장
printf("입력할 데이터 는 < enter -1 to end>\n");
scanf("%d", &data);
while (data != -1) {
insertList(hptr, pre, data);
if (pre->link == NULL) {//리스트 마지막 노드 포인터 확인
printf("Enter data again\n");
scanf("%d", &data);
}
}
}
void viewList(node *ptr) {
while (ptr != NULL) {
printf("%d ", ptr->data);
ptr = ptr->link;
}
}
에러가 수정이 안돼요 ㅠㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
댓글 입력