无法创建结构列表

时间:2014-12-16 17:12:38

标签: c list pointers struct singly-linked-list

 #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。可能出现问题。提前谢谢!

3 个答案:

答案 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 --> 

我使用你的方法在列表的尾部添加一个新节点,但是如果要将每个新节点添加到列表的头部,代码看起来会更简单。