-3
#include<stdio.h>
#include<malloc.h>

typedef struct node_t {
    int i;
    struct node_t* link;
} node;

node* head = NULL;

int main() {
    int i = 10;
    node* temp = NULL;
    head = (node *)malloc(sizeof(node));
    temp = (node *)malloc(sizeof(node));
    if(temp == NULL) {
        printf("\n malloc for temp node failed! \n");
    }
    else {
        /* linked list logic to add the elements in the beginning */
        while(i<=10) {
            temp->i = i;
            temp->link = NULL;
            if(head == NULL) {
                head = temp;
            }
            else {
                temp->link = head;
                head = temp;
            }
            i++;
        }
    }
    for(temp = head; temp->link != NULL; temp = temp->link) {
        printf("\n The data is:%d \n",temp->i);
    }
    free(temp);
    free(head);
    return 0;
}

我正在尝试一个简单的链表程序。我没有得到输出。

4

5 回答 5

2

你似乎有一个无限循环!(i 的值不变)

于 2012-11-29T07:49:01.870 回答
2

tmp1)每次为 分配值时都必须分配节点 ( ) tmp。而不是只分配一次tmp. 请参阅以下固定代码以了解如何操作

2)以下for循环是错误的:

for(temp = head; temp->link != NULL; temp = temp->link) {

for循环在以下代码中修复

3)free你必须浏览整个链表,然后释放每个节点。请参阅以下固定代码。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct node_t{
    int i;
     struct node_t* link;
}node;

node* head = NULL;

int main(){
     int i = 1;
     node* temp = NULL;

     /* linked list logic to add the elements in the beginning */
     while(i<=10){
         temp = (node *)malloc(sizeof(node));
         if(temp == NULL){
             printf("\n malloc for temp node failed! \n");
             exit(1);
         }
         temp->i = i;
         temp->link = NULL;
         if(head == NULL){
             head = temp;
         }
         else{
             temp->link = head;
             head = temp;
         }
         i++;
     }

     for(temp = head; temp != NULL; temp = temp->link){
         printf("\n The data is:%d \n",temp->i);
     }

     while (head!=NULL)
     {
        temp = head->link;
        free(head);
        head = temp;
     }

}
于 2012-11-29T08:03:18.013 回答
1

您不会i在 while 循环中更改变量的值,因此您永远不会退出 while 循环。

你需要类似的东西:

int i=1;
while(i<=10){
  // insert i in loop
  i++;
}
于 2012-11-29T07:49:05.440 回答
1

您没有更改循环变量的值,即i

您还需要malloc在 while 循环内创建单独的节点。现在,您的代码正在一次又一次地修改同一个节点。

于 2012-11-29T07:49:52.150 回答
1

除了关于无限循环的节点之外,由于你从来没有修改过的值i还有其他的错误。

 22         /* linked list logic to add the elements in the beginning */
 23         while(i<=10){
 24             temp->i = i;
 25             temp->link = NULL;
 26             if(head == NULL){
 27                 head = temp;
 28             }
 29             else{
 30                 temp->link = head;
 31                 head = temp;

看看你在这个循环中做了什么。如果 head 为 NULL(这不太可能,因为您在第 15 行重新分配了它,尽管分配可能会失败)您将 'head' 设置为 temp。

如果 head 不为 NULL,则将 temp 的“链接”设置为 head。然后你将 head 设置为 temp。然后你循环并重新做一遍。

所以你最终会得到指向 temp 的 head 和指向 temp 的 temp->link ... 一个恰好包含一个节点的循环列表。

试试这个:

int main()
{   
    int i = 0;
    node *temp;

    /* linked list logic to add the elements in the beginning */
    while(i != 10) 
    {
        /* First, allocate a new node */
        temp = (node *)malloc(sizeof(node));

        if(temp == NULL) 
            return -1; /* yikes */

        /* now set its value */
        temp->i = i++;

        /* and link it into the list, at the beginning */
        temp->link = head;
        head = temp;        
     }

     /* Now traverse the list, starting from 'head' */
     temp = head;

     while(temp != NULL)
     {
        /* save the current node in a temporary variable */
        node *temp2 = temp;

        /* and move 'temp' to point to the next node in the list */
        temp = temp->link;

        /* print the current node */
        printf("\n The data is: %d\n", temp2->i);

        /* and free the memory */
        free(temp2);
     }   

     return 0;
}
于 2012-11-29T08:03:08.637 回答