c언어 중단점 오류 해결방법좀요 ㅠㅠ 내공 1000드립니다

c언어 중단점 오류 해결방법좀요 ㅠㅠ 내공 1000드립니다

작성일 2023.10.02댓글 1건
    게시물 수정 , 삭제는 로그인 필요


#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //라이브러리 함수 , 전처리기 지시어 #include <stdlib.h> //라이브러리 함수 typedef struct ListNode { //사용자 지정 타입 정의 구조체를 사용함으로써 //struct ListNode를 ListNode로 줄여서 사용가능함. int data; //정수형 변수 data 선언 struct ListNode* link; //포인터를 멤버로 가지는 구조체 //구조체 ListNode는 정수형 데이터와 다음 노드를 가리키는 포인터로 이루어짐. } ListNode; //함수선언 void front_insert(ListNode** pp, int data); //pp가 가리키는 리스트의 맨 앞에 정수형 데이터 data를 갖는 //노드를 추가함. ListNode* front_remove(ListNode** pp);//pp가 라키는 리스트의 맨 앞 노드를 제거하고 해당 노드를 반환함. void rear_insert(ListNode** pp, int data); //pp가 가리키는 리스트의 맨 뒤에 정수형 데이터 data를 갖는 노드를 추가. void concatenate(ListNode** p1, ListNode** p2);//p1이 가리키는 리스트의 끝에 p2가 가리키는 리스트를 연결함. //p2는 이후에 빈 리스트로 초기화됨, void display(ListNode* head); //head가 가리키는 리스트의 노도들을 출력 ListNode* create_node(int data);//정수형 데이터 data를 가지는 새로운 노드를 생성. //해당 노드를 가리키는 포인터를 반환함. void front_insert(ListNode** pp, int data) { //삽입연산 ListNode* new_node = create_node(data); if (*pp == NULL) { //리스트가 빈 경우 (포인터 pp가 가리키는 값인 포인터 변수가 NULL값이 경우 *pp = new_node; // 리스트가 비어있는 경우 헤드 노드로 지정 new_node->link = new_node; // 자기 자신을 가리키는 원형 리스트 생성 } else { ListNode* last_node = *pp; //이중 포인터 pp가 가리키는 주소에 있는 ListNode 객체를 나타내는 // 포인터 last node를 선언함.pp가 연결 리스트의 노드를 가리키는 이중 포인터일때 // 이코드는 마지막 노드를 last_node에 저장함. --> last_node가 연결 리스트의 마지막 노드를 가리킴. while (last_node->link != *pp) { //last node가 연결 리스트의 마지막 노드를 찾을때까지 반복. last_node = last_node->link; //last node가 현재 연결 리스트의 마지막 노드를 가리킴. // 새로운 노드 (new node)를 연결 리스트의 마지막에 추가함. } last_node->link = new_node; new_node->link = *pp;//새로운 노드의 link 포인터를 현재 *pp가 가리키는 노드로 설정함. //새로운 노드가 기존의 노드를 가리키게 됨. *pp = new_node;//*pp를 새로운 노드를 가리키도록 } } ListNode* front_remove(ListNode** pp) { //삭제연산 if (*pp == NULL) { //포인터 pp가 가리키는 값이 NULL인 경우에 해당 return NULL; //더 이상 삭제할 노드가 없으므로 NULL을 반환하고 함수 종료. } ListNode* removed_node = *pp; //삭제될 노드를 가리키는 포인터인 removed_node를 선언. //*pp가 가리키는 노드로 초기화하기. ListNode* last_node = *pp; while (last_node->link != *pp) {//last node가 마지막 노드를 찾을때까지 반복 last_node = last_node->link; } if (*pp == (*pp)->link) { //조건문 . 리스트에 노드가 한 개가 남았다면 *pp = NULL; //포인터를 통해 변수 pp의 값을 NULL값으로 변경 } else { last_node->link = (*pp)->link; //아닌 경우 last node가 마지막 노드를 가리키고, *pp = (*pp)->link; //*pp가 현재 노드의 다음 노드를 가리키게 하기. } removed_node->link = NULL; //removed_node(제거된 노드)의 link 포인터를 NULL로 설정 //노드를 분리시킴. free(removed_node); // removed node 해제 return removed_node; //삭제된 node의 포인터를 반환 } void rear_insert(ListNode** pp, int data) { ListNode* new_node = create_node(data); if (*pp == NULL) {//포인터 pp가 가리키는 값이 NULL값으로 비어있는경우 *pp = new_node; // 리스트가 비어있는 경우 헤드 노드로 지정 new_node->link = new_node; // 자기 자신을 가리키는 원형 리스트 생성 } else { ListNode* last_node = *pp; while (last_node->link != *pp) {//반복문 while을 이용하여 //마지막 node가 가리키는 포인터 link가 포인터 pp가 아닐때까지 반복 last_node = last_node->link;//last node포인터는 구조체 멤버인 link를 //가리키는 포인터 } last_node->link = new_node; //new node를 구조체 멤버인 link를 //가리키는 last node 포인터에 대입 new_node->link = *pp; //new node가 가리키는 구조체 변수의 멤버 //link에 포인터 pp가 가리키는 변수의 값 대입. } } void concatenate(ListNode** p1, ListNode** p2) {// if (*p1 == NULL) { *p1 = *p2; //첫번째 리스트 .p1이 비어있으면(NULL을 가리키는 경우) 두번 쨰 리스트인 //p2의 내용을 첫번째 리스트 p1에 복사하기. p1이 p2의 내용을 가리키게 만들기. } else if (*p2 != NULL) { //첫번째리스트 p1이 비어있지 않고(Null을 가리키지 않고) //두번째 리스트 p2가 가르키는 값이 Null이 아닐때 ListNode* p1_last = (*p1)->link; //첫번째 리스트의 마지막 노드를 찾기 ListNode* p2_last = (*p2)->link;//두번째 리스트의 마지막 노드를 찾기 p1_last->link = *p2; //첫 번째 리스트의 마지막 노드의 link 포인터를 //두번째 리스트의 첫번째 노드를 가리키도록함. (*p1)->link = p2_last; free(*p2); //두번쨰 리스트의 첫번째 노드를 해제. *p2 = NULL; //두번째 리스트의 포인터를 Null로 설정하여 두번째 리스트가 //빈상태가 되도록 함. //첫번째 리스트가 비어있을 경우 두번쨰 리스트가 첫번째 리스트가 되고, 두 리스트가 //모두 비어있지 않을 경우 두 리스트를 연결하여 하나의 리스트로 만듬. } } void display(ListNode* head) { //방문연산-> 리스트상의 노드를 순차적으로 방문. ListNode* p = head;//포인터 p를 연결 리스트의 헤드노드로 초기화. if (p != NULL) { //연결리스트가 비어있지 않을 경우 if (p->link == head) { printf("%d->", p->data); //리스트에 노드가 한개만 있는 경우(자기자신을 가리키는 경우) //해당 노드의 데이터를 출력함. } else { p = p->link; printf("%d->", p->data); while (p != head) { p = p->link; printf("%d->", p->data);//리스트에 노드가 여러개 있는 경우 노드를 //순차적으로 방문하여 데이터를 출력함. 노드가 다시 헤드 노드를 가리킬때까지 반복. } } } printf("\n\n"); //모든 노드를 출력한 후 띄어쓰기. }// 연결 리스트를 헤드 노드부터 시작하여 끝까지 방문하고, 각 노드의 데이터를 화면에 출력. ListNode* create_node(int data) {//creat node라는 함수는 정수형 데이터를 받아 //새로운 노드를 생성하고 이 노드를 가리키는 포인터를 반납함. ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));//동적메모리 할당 if (new_node == NULL) {//구조체 포인터가 가리키는 값이 Null(0)인경우 printf("메모리 할당 에러\n");// malloc 함수를 이용하여 구조체 //ListNode 크기의 메모리를 할당한다. 이때 메모리 할당에 오류가 발생하면 //오류 메세지를 출력한뒤 프로그램을 종료한다. exit(1); } new_node->data = data;//새로운 노드의 data 멤버에 함수로 전달 받은 데이터를 할당. new_node->link = NULL;//새로운 노드의 link멤버를 NULL로 초기화함. return new_node;//새로 생성된 노드를 가리키는 포인터를 반환함. }//메모리를 동적으로 할당하여 새로운 노드들 생성하고 해당 노드의 데이터를 설정한 후, //이 노드를 가리키는 포인터를 반환함. -> 노드들을 이용하여 연결리스트 구성 int main() { //메인함수 호출 ListNode* head1 = NULL; ListNode* head2 = NULL; //두개의 빈 연결 리스트 생성 ListNode* removed_node = NULL;//removed node 선언 int data;//정수형 변수 선언 printf("1. front_insert 함수 실행 : \n"); int data1 = 20; //정수형 변수 선언 front_insert(&head1, data1);// front_insert 함수 호출 -> // 변수 head1의 주소 앞에 하나의 노드를 생성하고 data1값 넣기 (20) int data2 = 10;//정수형 변수 선언 front_insert(&head1, data2); // 변수 head1의 주소 앞에 하나의 노드를 생성하고 //data2값 넣기 (10) int data3 = 40;//정수형 변수 선언 front_insert(&head2, data3);// front_insert 함수 호출 // 변수 head2의 주소앞에 data3값 넣기 (40) int data4 = 30;//정수형 변수 선언 front_insert(&head2, data4); // 변수 head2의 주소앞에 data4값 넣기 display(head1); // 출력 : 10 -> 20 -> //display 함수 호출, //head1의 값 출력 display(head2); // 출력 : 30 -> 40 -> //display 함수 호출, //head2의 값 출력 printf("\n"); printf("2. front_remove 함수 실행 : \n"); removed_node = front_remove(&head1); //front remove 함수 호출 //변수 head1의 맨 앞의 노드를 하나 삭제하고 삭제된 주소를 변수 removed node에 저장.\ printf("removed node data in head1 list: %d \n", removed_node->data); free(removed_node);//removed node의 값 10이 출력되고 노드의 메모리가 해제됨. display(head1); // head1의 값 출력 : 20 -> 이 나오게 될 것이다. printf("\n"); printf("3. rear_insert 함수 실행 : \n"); rear_insert(&head2, 50); //rear insert 함수 호출 -> head2가 가리키는 //리스트 맨 뒤에 50을 데이터로 갖는 새로운 노드 추가됨. display(head2); // head2 출력. : 30 -> 40 -> 50 -> 이 나오게 될것이다. printf("\n"); printf("4. concatenate 함수 실행 : \n"); concatenate(&head1, &head2); //concatenate 함수 호출 //변수 head1의 연결 리스트 끝에 변수 head2의 원형 연결리스트를 연결하고 // head2에는 NuLL을 저장한다. display(head1); // head1 출력 : 20 -> 30 -> 40 -> 50 ->이 나오게 될것이다. printf("\n"); return 0;//반환값 }


코드는 위에 것이고,, 첨부한 사진처럼 오류가 뜨더라고요... 어떻게 해결해야 될까요??


#c언어 중단점 명령 실행됨 #c언어 중단점

profile_image 익명 작성일 -

코드를 보니 다른 부분들도 지적할 것이 보이긴 하지만, 질문 내용이 아니니 일단 넘어갈게요. 다른 부분들은 공부하시면서 스스로 해결해보시고, 안 되시면 질문 해주시면 될 것 같습니다.

우선 저기서는 front_remove 함수에서 free를 해준 노드를 또 free를 해주어서 나는 오류입니다. 이미 free를 해준 변수를 또 free를 해줄 수 없어요. front_remove 함수에서 free를 지워주셔야 합니다. (main에서 지워주셔도 저 오류는 안 뜨지만 이미 삭제된 값에 접근을 하려고 하니 이상한 값이 뜰 거예요)

그리고 참고로, 코드는 예쁘게 붙여넣어 주세요. 보기도 너무 힘들고 저 상태로 개발 툴에 붙여넣으니 엔터가 없어서 모두 주석처리 되는 바람에 일일히 엔터 쳐주고 나서 실행시켰습니다. 글 쓰실 때 위에 { } 요렇게 생겨서 소스코드라고 적힌 부분 누르면 아래처럼 뜨니까 이런 것도 써주시면 좋을 것 같습니다!

요걸 누르면

//요렇게 떠요

오류 해결 부탁드려요ㅠㅠ(내공10...

... 설치 방법을 보고 다운로드 했습니다.) 정말 어떻게 해야할지 모르겠습니다. C언어 공부하는게 이렇게 어려웠나 싶은데 제발 답변 부탁드립니다 ㅠㅠ 답변이...

블러드코인 오류[내공 500]

채굴하려고 들어가면 이렇게 뜨면서 안되는데 해결방법좀요 ㅠㅠ 아직... 보여주시면 시작에 탄력이 붙으실수 있도록 블러드 1000 보내드립니다~

컴퓨터 오류가 너무 많이 나요<내공 15>

... 시원한 답변 부탁드립니다. 답변: 먼저... 이 오류해결 할수 있는 방법을 알려 주세요................ 행복하고 유용한 정보세상 Q:치명적인 오류 ㅠ ㅠ 컴퓨터 사양...

C 언어에서 12345입력시...

... 답변좀 부탁드립니다. 내공 20걸게요 ㅠㅠ int a... a = a % 1000 ; printf("%d천", b) ; } 이런식으로 하면 되지 않을까요??? 완성한건 아니라서 오류가...