我从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
我怎么能解决这个问题呢?谢谢,抱歉英语不好
答案 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){...}