#include <stdio.h>
#include <stdlib.h>
struct data {
int x;
struct data *next;
};
typedef struct data d_t;
/* Main fuction */
int main(){
int x;
d_t test , *root , *head;
scanf("%d" , &x);
/* Sets pointer values */
root=&test;
head=root;
head->next=NULL;
/* While fuction represends "ADD struct to list" */
while(x==1){
/* Allocating memory for new struct */
head=(d_t*)malloc(sizeof(d_t));
head->x=1;
printf("%d\n" , head->x);
/* Sets pointer values for next struct */
head->next=head;
head->next=NULL;
/* Scanfs 'x' to see if user wants to continue */
scanf("%d" , &x);
}
/* Prints Whole list */
while(root!=NULL){
printf("%d --> " , root->x);
root=root->next;
}
return 0;
}
该程序应打印:1 --> 1 --> 1---> until NULL
。可能出现问题。提前谢谢!
答案 0 :(得分:1)
此代码:
head->next=head;
head->next=NULL;
显然没有做你想要的事。它将head
的下一个设置为head
本身,然后将其设置回NULL
。如此有效,在每次迭代中,您创建一个新结构并将其next
设置为NULL,并且前一个节点正在丢失。不要只使用单个head
变量,而是引入一个新的变量,将其分配给head->next
,然后将head
切换为下一个节点。
答案 1 :(得分:1)
以下是构建链表的传统方法:
int main() {
int x;
d_t *root, *head; // you don't need "test"
scanf("%d", &x);
head = NULL;
while (x == 1) {
root = (d_t*)malloc(sizeof(d_t));
root->x = 1;
root->next = head;
head = root;
scanf("%d", &x);
}
root = head;
while (root) {
printf("%d\n", root->x);
root = root-> next;
}
}
分析第一个while循环。列表从头到尾添加,从head = NULL开始。 root创建一个struct,head成为root的先前值,然后将其附加到新的根值。
输出:
1->1->1->..etc...-> NULL
答案 2 :(得分:1)
尝试以下
#include <stdio.h>
#include <stdlib.h>
struct data
{
int x;
struct data *next;
};
typedef struct data d_t;
int main( void )
{
d_t *head = NULL;
d_t **current = &head;
int x;
while ( scanf( "%d" , &x ) == 1 && x == 1 )
{
*current = malloc( sizeof( d_t ) );
( *current )->x = x;
( *current )->next = NULL;
current = &( *current )->next;
}
/* Prints Whole list */
for ( current = &head; *current != NULL; *current = ( *current )->next )
{
printf( "%d --> " , ( *current )->x );
}
return 0;
}
如果要输入例如
1 1 1 1 1 2
然后输出
1 --> 1 --> 1 --> 1 --> 1 -->
我使用你的方法在列表的尾部添加一个新节点,但是如果要将每个新节点添加到列表的头部,代码看起来会更简单。