C语言 为什么while循环函数不能运行,print函数不能运行?

fivyi3re  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(234)
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
#include <stdbool.h>

typedef struct node { 
  int data; 
  struct node *next; 
} NodeT;

NodeT *makeNode(int v);
void joinLL(NodeT *head, int v);
void showLL(NodeT *head);
void freeLL(NodeT *head);
int a;

int main(void){
   
   NodeT *head= NULL;
   bool bo=true;
   while (bo){
      printf("Enter an integer:");
      if (scanf("%d", &a)){
       joinLL(head, a);
       return bo;
     }
       else{
          printf("Done.\n");
           break;
        }
    
   }
  
    showLL(head);
    freeLL(head);

    return 0;
    
}

//creat a new node
NodeT *makeNode(int v) { 
  NodeT *new = malloc(sizeof(NodeT)); 
  assert(new != NULL); 
  new->data = v; // initialise data
  new->next = NULL; // initialise link to next node
  return new; // return pointer to new node
}

//append a new element with data v at the end of list.
void joinLL(NodeT *head, int v){
    NodeT *insert=makeNode(v);
    insert -> next = NULL;  

    if (head==NULL){
        head = insert;  
    }
    else{
        NodeT *temp= head;
        while (temp->next != NULL){
            temp=temp->next;
       }
        temp->next=insert;
    }

 }

    

void showLL(NodeT *head) {

    //iterate the entire linked list and print the data
   NodeT *p;

   for (p = head; p!= NULL; p = p->next) {
        int elements= p->data;
        printf("Done. List is %d-->", elements);
   }
}

void freeLL(NodeT *head) {
   NodeT *p, *temp;

   p = head;
   while (p != NULL) {
      temp = p->next;
      free(p);
      p = temp;
   }
}

我已经更新了一些代码。我想输入像,要求输入多次,它将输出链表结果,否则,循环将终止。但程序显示,我不能得到多个输入和输出不能显示以及。我是新的c和不知道如何修复它

bpsygsoo

bpsygsoo1#

您的程序至少存在以下两个问题:
1.在函数main中,语句return bo;将导致程序终止。这不是您想要的。您应该删除此行。
1.永远不要更改函数main的变量head的值,这样它的值就始终为NULL。特别是,更改函数joinLL的变量head不会更改函数main的变量head的值。这两个变量是不同的,你的函数joinLL所做的是创建变量head的一个副本(同名),并且只改变副本的值,而不是改变原始变量的值。
修正第二个问题,当从main调用joinLL时,你应该传递一个指向变量head的指针,而不是只传递head的值。这样,你就可以在函数joinLL内部修改函数main的变量head
例如,可以将函数joinLL重写为:

//append a new element with data v at the end of list.
void joinLL(NodeT **pp_head, int v) {

    //make pp_next point to the "next" member of the last
    //node of the list, or, if the list is empty, let it
    //continue to point to the variable "head" of the
    //function "main"
    NodeT **pp_next = pp_head;
    while ( *pp_next != NULL )
    {
        pp_next = &(*pp_next)->next;
    }

    //create the new node
    NodeT *insert = makeNode(v);

    //add the new node to linked list
    *pp_next = insert;
}

当然,您还必须相应地更改函数joinLL的前向声明。此外,在调用函数joinLL时,您还必须更改以下行

joinLL(head, a);

致:

joinLL(&head, a);

如果你不想使用指向指针的指针(例如,因为你觉得它们太复杂),你也可以让函数joinLL返回新的头节点的地址,如下所示:

//append a new element with data v at the end of list.
NodeT *joinLL(NodeT *head, int v) {
    NodeT *insert = makeNode(v);

    if (head==NULL){
        return insert;
    }

    NodeT *temp = head;

    while (temp->next != NULL){
        temp = temp->next;
    }

    temp->next = insert;

    return head;
}

在这种情况下,在函数main中,必须更改行

joinLL(head, a);

致:

head = joinLL(head, a);

相关问题