2014-12-16 2 views
0

Эта программа должна удалить узел из связанного списка (в моем случае из 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); 
    } 
} 
+0

Ваша проблема может быть одной из областей. Посмотрите ключевое слово «extern», примеры использования Google или выполните поиск здесь. 'extern' позволяет вам определить что-то в заголовке и использовать его в нескольких файлах .c (включая этот заголовок), сохраняя при этом одинаковое значение во всех них в любой момент времени. Аналогично в функции действует «статический», используемый в файле .c, за исключением «extern», видимость может быть расширена до всего проекта. – ryyker

+0

Самая большая проблема с 'delete_node' заключается в том, что она использует' exit (0) 'вместо' return'. 'exit (0)' немедленно завершает программу, и это не то, что вы хотите. Вы просто хотите «вернуть» из подпрограммы. Кроме того, вы (почти) никогда не хотите '# включать'' .c' -файл в другой файл '.c'. Поэтому удалите '#include 'LinkedList.c" из 'main.c' и скомпилируйте с помощью' gcc -Wall main.c LinkedList.c -o myProgram' – user3386109

+0

Связанный список без отладки aparrent. Еще раз. –

ответ

1

В вашей ask_for_value() функции

scanf("%d", &x); 

должен быть

scanf("%d", x); 

Кроме того, не #include.c файлы. Они предназначены для компиляции.

Дальше, ваша функция delete_node() неверна. Это прекратит выполнение вашей программы, столкнувшись с exit(0), что, вероятно, не является тем, что нужно. Вместо этого вы можете использовать return 0.

+0

Я исправил те ошибки, которые вы заметили, также заметил, что в print_list я изменил с if на while, чтобы создать цикл вместо одиночного сравнения. Но изменение выхода на возврат на самом деле не имеет особого значения, числа без остановок, другие не реагируют, только 100 дает правильный ответ. – DevGambit

+0

@DevGambit IMO, в вашем коде есть много проблем, особенно в функции 'delete_node()'. Пожалуйста, прочитайте комментарии в исходном вопросе. Я не вижу причин передавать 6 аргументов 'delete_node()'. Попытайтесь немного улучшить свою логику. –

+0

Я отредактировал функцию delete_node, но удаление значения главы еще не сработало. – DevGambit