双重链表不会工作

时间:2014-02-04 19:43:19

标签: c

当我运行它时,它不报告任何错误,但实际上没有发生任何错误。它不会返回指向列表中最小元素的指针,它只是什么都不做。

用指针指向双重的第一个元素来创建一个函数 链表,返回指向列表中最小元素的指针

#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);
}

1 个答案:

答案 0 :(得分:0)

您的end var在main()中定义,当您将其传递给add时,您实际传递了该指针的副本,因此在该函数内所做的更改不会被复制回来到main()范围内的变量。

c中通常的方法是将其地址(DLlist**)传递给函数并将其用作双指针,因此更新将能够更新外部变量。

您也可以将end全局设为first,但这是一个坏习惯,因为它会阻止同时使用多个列表。最好避免使用全局变量,但它也可以起作用。