#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吗?
1条答案
按热度按时间cbeh67ev1#
您的代码至少存在三个严重问题。
第一个问题是指针头没有初始化。
第二个问题是函数
joinLL
返回指向头节点的指针或指向插入节点的指针,这使得函数接口混乱。此外,函数调用不正确
函数需要类型为
int
而不是int *
的第二个参数。由于定义的列表是一个单链表,因此在列表的开头添加新节点在逻辑上更加一致和高效。在这种情况下,使用您的方法,函数看起来非常简单,如下所示
第三个是在while循环的main中
指向头节点的指针不变。
注意这个函数声明没有原型
使得代码不安全。例如在C23标准中,这样的声明是被禁止的。