c# 为什么showLL函数的编码不能打印?

kzipqqlq  于 2023-03-06  发布在  C#
关注(0)|答案(1)|浏览(193)
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>

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

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

int main(void){
   
   NodeT *head;
   printf("Enter an integer:");
   while (scanf("%d", &a)){
       joinLL(head, &a);
       printf("Enter an integer:");
   }
  showLL(head);
  if(scanf("%d", &a)!=1){
      printf("Done.\n");
    }
        

    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.
NodeT *joinLL(NodeT *head, int v){
    NodeT *insert=makeNode(v);
    insert -> next = NULL;  

    if (head==NULL){
        head = insert;  
    }
    else{
        NodeT *temp;
        temp=head;
        while (temp->next != NULL){
        temp=temp->next;
       }
        temp->next=insert;
    }
    return 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;
   }
}

我试了很多次运行这个函数,发现showLL函数不能打印。我的代码有什么问题吗??我想是指针或者一些非常基本的东西,但是我是c语言新手。另外,我想输入一个非数字字符,然后打印完成。我可以写scanf(“%d”,&a)!=1吗?

cbeh67ev

cbeh67ev1#

您的代码至少存在三个严重问题。
第一个问题是指针头没有初始化。

NodeT *head;

第二个问题是函数joinLL返回指向头节点的指针或指向插入节点的指针,这使得函数接口混乱。
此外,函数调用不正确

joinLL(head, &a);
             ^^^

函数需要类型为int而不是int *的第二个参数。
由于定义的列表是一个单链表,因此在列表的开头添加新节点在逻辑上更加一致和高效。在这种情况下,使用您的方法,函数看起来非常简单,如下所示

NodeT * joinLL( NodeT *head, int v )
{
    NodeT *insert = makeNode( v );
    insert -> next = head;  

    return insert;
}

第三个是在while循环的main中

while (scanf("%d", &a)){
    joinLL(head, &a);
    printf("Enter an integer:");
}

指向头节点的指针不变。
注意这个函数声明没有原型

NodeT *makeNode();
NodeT *joinLL();
void showLL();
void freeLL();

使得代码不安全。例如在C23标准中,这样的声明是被禁止的。

相关问题