如何在C中正确反转单链表?

时间:2015-10-13 04:42:48

标签: c data-structures linked-list

我从C开始,并且我被要求做一个在其节点数据中有随机整数的链表,它们必须是上升顺序,后来我必须用一个函数来反转它们的顺序。我遇到的问题是,在我的反向输出中,我只获得第一个数字,甚至没有反转。

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

int N;

typedef struct node{
int num;
struct node *next;
}nodes;

int first_node(nodes *head){
if(head == NULL){
    printf("Error");
}
  else{
    head -> num= rand();
    head->next=NULL;
    }
}

int second_node(nodes *head){
nodes *uno=malloc(sizeof(nodes));
if(uno == NULL){
    printf("Error");

}

else{
    uno->num = rand();
    uno->next = NULL;
            if( uno->num>head->num){
               head->next=uno;

            }
            else{
                head= uno->next;
            }

}

}

int insert_node(nodes *head){
    nodes *dos=malloc(sizeof(nodes));
    if(dos == NULL){
        printf("Error");

    }

    else{
        dos->num = rand();
        dos->next = NULL;


        nodes *current = head;
        while(current!= NULL){
                if(current->num<dos->num && current->next==NULL){
                    current->next = dos;
                    return;

                }

                else if (current->num<dos->num && current->next->num>dos->num){
                dos->next=current->next;
                current->next=dos;
                return;

                }
                else if(head->num>dos->num){
                dos->next=head;
                head=dos;

        }
        current=current->next;

    }

}}

void printnodes(nodes *head){
    nodes *current = head;
    while (current != NULL){
        printf("%d\n",current->num);
        current = current ->next;
    }


}



void reverse(nodes *head)
{
 nodes *a=head->next;
 if(a!=NULL)
 {
   nodes *b=a->next;
   a->next=head;
   head->next=NULL;
   head=a;
   if(b!=NULL)
   {
     while(b!=NULL)
     {
      a=b;
      b=b->next;
      a->next=head;
      head=a;
     }
     a->next=head;
     head=a;
   }

   }
 }

int main(){
printf("Insert the number of nodes u want to create:");
scanf("%d", &N );
nodes *head =malloc(sizeof(nodes));
int i =3;

if(N==1){
    first_node(head);
}
else if (N ==2){
    first_node(head);
    second_node(head);

}
else if (N>2){

    first_node(head);
    second_node(head);
           while(i<=N){
            insert_node(head);
            i++;
           }
}


printnodes(head);
printf("\n\n Reversed \n\n");

reverse(head);
printnodes(head);


return 0;


}

创建5个节点的输出是: 为了: 41 3445 3890 8709 16777

反转: 41

我怎么能解决这个问题呢?谢谢,抱歉英语不好

1 个答案:

答案 0 :(得分:0)

您的代码中存在两个非常明显的问题:

第一个是您分配给局部变量,期望在函数返回后反映该赋值。我在谈论你在大多数职能中对head的任务。这里的问题是当你将一个参数传递给一个函数时。它通过值传递 ,这意味着它被复制了,你所调用的函数中只有一个副本或原始值。正如您应该知道的那样,更改副本不会改变原件。

我快速浏览的第二个问题是在second_node功能中,您首先要做的是

uno->next = NULL;

可能后跟

head= uno->next;

这会将NULL分配给head

第一个问题很容易通过模拟称为传递引用的东西来解决。我说仿效,因为C只有值传递。您可以使用指针模拟C中的引用传递,这意味着要在C中“通过引用”传递指针,您必须将指针传递给指针,如

int second_node(nodes **head){
    ...
}

然后使用address-of运算符调用它:

second_node(&head);

然后在second_node中使用解除引用运算符*来访问“原始”head指针,例如

*head = uno->next;

写上面的内容我注意到了一个第三个​​问题,那就是你声明一些函数返回int,但你实际上并没有从函数中返回任何东西。值得庆幸的是,您似乎没有在任何地方使用返回的值,但它仍然是未定义的行为,以便不返回应该返回值的函数中的值。如果不应该从函数返回值,则必须将其声明为返回void

void second_node(nodes **head){...}