2012-10-24 114 views
-3

我很难弄清楚如何将元素添加到链表中的节点中的列表属性,特别是如何设置指针。C - 添加到列表节点内的链接列表

我有一个结构,像这样:

typedef struct Node 
{ 
    int value; 
    struct Node *elements; 
    struct Node *next; 
}Node; 
Node *mainlist; 
Node *elemlist; 

而且我希望能够找到mainlist特定节点,并从elemlist的所有元素添加到该节点*元素。

我有这个功能,这需要在mainlist和值检查:

void add_elements(Node *mainlist, int value) 
{ 
    Node *ptr = mainlist; 
    Node *ptr2 = elemlist; 
    while(ptr != NULL) 
    { 
      if(value == ptr->value) 
      { 
        while(ptr2 != NULL) 
        { 
          Node *newNode = malloc(sizeof(Node)); 
          newNode->value = ptr2->value; 
          newNode->next = ptr->elements; 
          ptr->elements = newNode; 
          ptr2 = ptr2->next; 
        } 
      } 
      ptr = ptr->next; 
    } 
} 

我得到一个分段错误所以它显然不是增加从elemlist元素到节点的元素。我很确定我的指针做错了什么。

任何帮助,这将不胜感激。谢谢!

+1

这是实际的代码为'节点 - >值= ptr2->值; '不会编译。 – hmjd

+2

似乎有不一致的使用'节点'与'SymTblNode' - 我怀疑这是实际的代码,这使得诊断问题变得困难/不可能。如果OP学会了使用调试器来解决这些微不足道的问题,它也可以更快更简单。 –

+1

如果你通过你的编译器运行它,应该有几个警告和错误。先解决这些问题,然后再问。 –

回答

1

我想这:

 Node->value = ptr2->value; 

应该是这样的:

newNode->value = ptr2->value; 
+1

这将导致编译失败,而不是分段错误。 – hmjd

1

调用malloc为您newNode之后,你应该初始化valuenext项目为newNode

但是,您正在更改Node->value,但您应该更改newNode->value


您必须newNode->value = ptr2->value;

1

它看起来像你的赛格故障更换Node->value = ptr2->value; while循环执行后,你的内心会来,因此ptr2所指向的链接列表的末尾。然后,如果第二个循环再次执行,您正在访问无效内存。尝试在内部循环后重置ptr2。

所以像

void add_elements(Node *mainlist, int value) 
{ 
    Node *ptr = mainlist; 
    Node *ptr2 = elemlist; 
    Node *tmp = ptr2; 
    while(ptr != NULL) 
    { 
      if(value == ptr->value) 
      { 
        while(ptr2 != NULL) 
        { 
          Node *newNode = malloc(sizeof(Node)); 
          newNode->value = ptr2->value; 
          newNode->next = ptr->elements; 
          ptr->elements = newNode; 
          ptr2 = ptr2->next; 
        } 
        ptr2 = tmp; 
      } 
      ptr = ptr->next; 
    } 
} 
+1

或者你可以简单地移动Node * ptr2 = elemlist;在外部内部,所以它在每次执行时被初始化 – fayyazkl

0

说不上为什么你有段错误,但是那是因为你正在设置newNode->下一个(或没有)与未定义的指针地址。

typedef struct Node{ 
int value; 
struct Node *elements; 
struct Node *next; 

} Node;

Node * mainlist; 节点* elemlist;

void add_elements(Node* mainlist, int value){ 
    Node* ptr = mainlist; 
    Node* ptr2 = elemlist; 
    while(ptr != NULL) 
    { 
     printf("* %u\n", ptr->value); 
     if(value == ptr->value) 
     { 
      while(ptr2 != NULL) 
      { 
       Node *newNode = malloc(sizeof(Node)); 
       newNode->value = ptr2->value; 
       newNode->next = ptr->elements; 
       ptr->elements = newNode; 
       ptr2   = ptr2->next; 
      } 
     } 
     ptr = ptr->next; 
    } 
} 

int main(int argc, const char * argv[]){ 

     Node* node = calloc(1, sizeof(Node)); 
     Node* node2 = calloc(1, sizeof(Node)); 
     node->next = node2; 
     node2->value = 17; 
     add_elements(node, 2); 
    } 
    return 0; 
} 

在工作(即使我已经添加的元素的功能外),但把它作为一个练习)