이 프로그램은 입력 한 숫자와 동일한 데이터를 연결된 목록 (내 경우에는 10, 20, 30, ..., 100)에서 삭제해야합니다. 제대로 작동하지 않습니다. 그것은 전체 목록을 보여 주어야하지만 그것은 10 이후에 멈추고 숫자를 선택하고 나누기를 제공합니다.C 연결된 목록이있는 여러 파일 프로그램, 노드 제거
#include <stdio.h>
#include <stdlib.h>
#include "LinkedList.h"
#include "LinkedList.c"
int main() {
int x;
int change=0;
LINK head, curr, currB, tail;
head = NULL;
curr = NULL;
currB = NULL;
tail = NULL;
create_list(&head, &curr, &tail);
print_list(head, curr);
ask_for_value(&x);
delete_node(head, curr, currB, tail, &change, x);
if (0 == change)
printf("\nValue %d is not on the list\n", x);
print_list(head, curr);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "LinkedList.h"
void create_list(LINK *head, LINK *curr, LINK *tail) {
int i;
for(i=10; i<100; i+=10) {
(*curr)=(LINK)malloc(sizeof(ELEMENT));
(*curr)->data = i;
if(i==10) {
(*curr)->next = NULL;
(*tail)=(*curr);
(*head)=(*curr);
}
else {
(*curr)->next = NULL;
(*tail)->next = (*curr);
(*tail)=(*curr);
}
}
}
void delete_node(LINK head, LINK curr, LINK currB, LINK tail, int *change, int x) {
int i;
if(head->data==x) {
curr=head;
head=curr->next;
free(curr);
(*change)=1;
exit(0);
}
if(tail->data==x){
curr=head;
while(curr->next!=tail)
curr=curr->next;
free(tail);
tail=curr;
tail->next=NULL;
(*change)=1;
exit(0);
}
curr=currB=head;
while(curr->data!=x || curr->next!=NULL){
currB=curr;
curr=curr->next;
}
if(curr->data!=x)
exit(0);
if(currB==curr){
head=curr->next;
free(curr);
(*change)=1;
exit(0);
}
currB->next=curr->next;
free(curr);
(*change)=1;
}
void print_list(LINK head, LINK curr)
{
curr=head;
if (curr!=NULL){
printf("%d >> ",curr->data);
curr = curr->next;
}
}
void ask_for_value(int *x) {
printf("Enter value which should be removed from the list\n");
scanf("%d", &x);
}
#ifndef LINKED_LIST_H_
#define LINKED_LIST_H_
struct linkedList{
int data;
struct linkedList *next;
};
typedef struct linkedList ELEMENT;
typedef struct linkedList *LINK;
void create_list(LINK *head, LINK *curr, LINK *tail);
void delete_node(LINK head, LINK curr, LINK currB, LINK tail, int *listChange, int x);
void print_list(LINK head, LINK curr);
void ask_for_value(int *x);
#endif
두 번째 파일은 LinkedList.c이며, 세 번째는
편집 LinkedList.h
입니다 : 내가 delete_node를 변경 한 모든 작동 값을 제외한 값. 당신의ask_for_value()
기능에서 17,451,515,
void delete_node(LINK head, LINK curr, LINK currB, LINK tail, int x) {
curr=currB=head;
while(curr->data!=x && curr->next!=NULL) {
currB=curr;
curr=curr->next;
}
if(head->data==x) {
head=curr->next;
free(currB);
}
else if(tail->data==x) {
tail=currB;
tail->next=NULL;
free(curr);
}
else if(curr->data!=x) {
printf("Element with given value could not be found!\n");
}
else{
currB->next=curr->next;
free(curr);
}
}
문제는 범위 중 하나 일 수 있습니다. 'extern'키워드, Google 사용 예 또는 여기를 검색하십시오. 'extern'은 헤더에 무언가를 정의 할 수있게 해주 며, 헤더에있는 여러 개의 .c 파일에서 사용할 수 있습니다. 동시에 모든 값을 유지합니다. 'extern'을 제외하고는 .c 파일에서 사용 된 '정적'효과와 비슷한 기능으로 전체 프로젝트에 가시성을 확장 할 수 있습니다. – ryyker
'delete_node'의 가장 큰 문제점은'return' 대신'exit (0)'을 사용한다는 것입니다. 'exit (0)'은 프로그램을 즉시 종료시키고, 그것은 당신이 원하는 것이 아닙니다. 당신은 단지 서브 루틴으로부터'return '하고 싶을뿐입니다. 또한, (거의)'.c' 파일을 다른'.c' 파일에'# include '하고 싶지는 않습니다. 그래서'#include "LinkedList.c"를'main.c'에서 제거하고'gcc -Wall main.c LinkedList.c -o myProgram'을 사용하여 컴파일하십시오. – user3386109
aparrent 디버깅없이 링크 된리스트. 다시. –