具有范围和全局变量的Malloc

时间:2014-04-04 19:07:26

标签: c malloc

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

struct node {
  int num;
  struct node *next;
}*head=NULL, *curr=NULL;

void print(){
  curr = head;
  while(curr != NULL){
    printf("%d\n", curr->num);
    curr = curr->next;
  }
}

struct node* memAlo(){
  return (struct node *)malloc(sizeof(struct node));
}

void addNode(int no){
  curr = head;
  while(curr != NULL){
    curr = curr->next;
  }
  curr = memAlo();
  if(curr == NULL){
    printf("\nmemory up\n");
    return;
  }
  else{
    curr->num = no;
    curr->next = NULL;
    printf("%d\n",curr->num);
  }
}

void hellop(){
  printf("%d", head->num);
}

int main(){
  int i;
  curr = head;
  for(i=1;i<10;i++){
    addNode(i);
  }
  print();
  /*head = memAlo();
  head->num = 1;
  head->next = NULL;
  hellop();*/
}

我确信我已经搞砸了。问题是头指针没有得到memAlo()fn()分配的内存但是如何到达那里?请帮忙

我正在尝试创建一个包含1到9数字的单链表,并使用print()打印它们。实际上AddNode()是每次在main()中执行for循环时在链表的末尾创建单个节点。

5 个答案:

答案 0 :(得分:1)

您在首次定义head = NULL的位置设置了head。除了那个地方,我们从未在您的计划中的任何位置head的左侧看到=。当然,head总是等于NULL,而不是其他任何东西。

您可能希望在addNode函数的开头插入一些代码来测试此时是否head == NULL;如果确实如此,您需要将memAlo()的结果分配给head而不是curr。您还必须调整其他一些逻辑。

答案 1 :(得分:0)

您分配节点的代码是错误的。它应该创建一个节点,为它创建一些空间,然后返回它。

struct node *memAlo() {
    struct node *nd = malloc(sizeof(*nd));
    return nd;
}

这会创建一个指向节点的指针,正确分配它,然后返回它。

答案 2 :(得分:0)

我看到的问题:

  1. 不处理空列表,即head == NULL
  2. 创建彼此未链接的节点。

    curr = memAlo();

    allocated memory for a node and returns it to you, but it does not connect the node with anything else.

  3. Try this:

    void addNode(int no){
        struct node* temp = NULL;
    
        // Deal with an empty list.
        if ( head == NULL )
        {
           head = memAlo();
           head->num = no;
           head->next = NULL;
        }
    
      // Move curr until we reach the last node of the list.
      curr = head;
      while(curr->next != NULL){
        curr = curr->next;
      }
      temp = memAlo();
      if(temp == NULL){
        printf("\nmemory up\n");
        return;
      }
      else{
        // Link the new node to the previous last node.
        temp->num = no;
        temp->next = NULL;
        printf("%d\n",temp->num);
        curr->next = temp;
      }
    }
    

答案 3 :(得分:0)

似乎因为head最初是NULL,然后你开始分配节点而不保存第一个地址,你就丢失了第一个地址,然后就可以了。从头开始走列表。

您注释掉的部分说明了问题。

作为旁注,您的计划中没有free。请记住始终free记住alloc

答案 4 :(得分:0)

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

struct node
{
  int num;
  struct node *next;
};

struct node *head, *curr;
struct node *pos;

void addNode(int n)
{
  if(head==NULL)
  {
    head = (struct node*)malloc(sizeof(struct node));
    head->num = n;
    head->next = NULL;
    curr = head;
  }
  else
  {
    while(curr != NULL)
    {
      pos = curr;
      curr = curr->next;
    }
    curr = (struct node*)malloc(sizeof(struct node));
    curr->num = n;
    curr->next = NULL;
    pos->next = curr;
  }
}

void printList()
{
  curr = head;
  while(curr != NULL)
  {
    printf("%d",curr->num);
    curr = curr->next;
  }
}

int main()
{
  head = NULL;
  curr = head;
  int i, a[] = {4,5,1,2,3,9,0};
  for(i=0;i<7;i++)
  {
    addNode(a[i]);
  }
  curr = head;
  printList();
}

这似乎解决了我的问题。我想通了。谢谢你的帮助。