Эта программа должна удалить узел из связанного списка (в моем случае из 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
EDIT: Я изменил delete_node, работает с любым за исключением 10.
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 (включая этот заголовок), сохраняя при этом одинаковое значение во всех них в любой момент времени. Аналогично в функции действует «статический», используемый в файле .c, за исключением «extern», видимость может быть расширена до всего проекта. – ryyker
Самая большая проблема с 'delete_node' заключается в том, что она использует' exit (0) 'вместо' return'. 'exit (0)' немедленно завершает программу, и это не то, что вы хотите. Вы просто хотите «вернуть» из подпрограммы. Кроме того, вы (почти) никогда не хотите '# включать'' .c' -файл в другой файл '.c'. Поэтому удалите '#include 'LinkedList.c" из 'main.c' и скомпилируйте с помощью' gcc -Wall main.c LinkedList.c -o myProgram' – user3386109
Связанный список без отладки aparrent. Еще раз. –