#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和不知道如何修复它
1条答案
按热度按时间bpsygsoo1#
您的程序至少存在以下两个问题:
1.在函数
main
中,语句return bo;
将导致程序终止。这不是您想要的。您应该删除此行。1.永远不要更改函数
main
的变量head
的值,这样它的值就始终为NULL
。特别是,更改函数joinLL
的变量head
不会更改函数main
的变量head
的值。这两个变量是不同的,你的函数joinLL
所做的是创建变量head
的一个副本(同名),并且只改变副本的值,而不是改变原始变量的值。修正第二个问题,当从
main
调用joinLL
时,你应该传递一个指向变量head
的指针,而不是只传递head
的值。这样,你就可以在函数joinLL
内部修改函数main
的变量head
。例如,可以将函数
joinLL
重写为:当然,您还必须相应地更改函数
joinLL
的前向声明。此外,在调用函数joinLL
时,您还必须更改以下行致:
如果你不想使用指向指针的指针(例如,因为你觉得它们太复杂),你也可以让函数
joinLL
返回新的头节点的地址,如下所示:在这种情况下,在函数
main
中,必须更改行致: