2014-02-04 8 views
-2

Когда я запускаю это, он не сообщает никаких ошибок, но ничего не происходит. Он не вернет указатель на наименьший элемент списка, он просто ничего не делает.. Связанный список не работает

сделать функцию с указателем, который указывает на первый элемент дважды связанного списка, который возвращает указатель на наименьший элемент списка

#include<stdio.h> 
#include<stdlib.h> 

typedef struct list DLlist; 

struct list{ 
    DLlist *next, *previous; 
    int number; 
}; 

DLlist *first = NULL; 

int n=0; 

DLlist* add(DLlist *end, int number){ 

DLlist* perm; 
    perm = (DLlist *)malloc(sizeof(DLlist)); 
    perm->number = number; 


if(first==NULL){ 
     first = perm; 
     first->next = NULL; 
     first->previous = NULL; 
     end = perm; 
}else{ 

    perm->next = NULL; 
    end->next = perm; 
    perm->previous = end; 
    end = perm; 
    return end; 
    n++; 

    } 

} 

DLlist* return_smallest(DLlist *first){ 
    DLlist *max; 
    DLlist *current; 
    first = max; 
    current = first; 

for(int i=0;i<n;i++){ 
     if(current->number < max->number) max = current; 
     current = current->next; 
    } 
    return max; 
} 

void main(){ 

    DLlist *end = NULL; 

    int number; 
    int choice; 

do{ 
    printf("1-Add elements to list: \n" 
      "2-Return a pointer to the smallest element in the list\n"); 
    scanf("%d",&choice); 
    scanf("%d",&number); 

switch(choice){ 
    case 1: end = add(end, number);break; 
    case 2: printf("%d",(return_smallest(first))->number); 
    } 

}while(choice == 1); 
} 
+2

Предоставьте более полезное описание проблемы, чем «это не делает работу». – Cairnarvon

+0

Я внес некоторые изменения ... – user3053047

ответ

0

Ваш end вар определяется в main(), когда вам передайте его add, вы фактически передадите копию этого указателя, поэтому изменение, сделанное внутри функции, не будет скопировано обратно в переменную в области main().

Обычный подход в c состоит в том, чтобы передать его адрес (DLlist**) функции и использовать его как двойной указатель, чтобы обновление могло обновлять внешнюю переменную.

Вы также можете сделать end глобальным, как first, но это плохая привычка, так как это предотвратит использование нескольких списков одновременно. Глобальные переменные лучше избегать, но это будет работать.

Смежные вопросы