2017-10-04 13 views
-5
#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
int main(int argc, char const *argv[]) { 
    struct sam{ 
    int data; 
    struct sam *next; 
    }; 
    struct sam node[11]; 
    for(int i=0;i<10;i++){ 
    node[i].data = i/2; 
    node[i].next = &node[i+1]; 
} 
node[10].next=NULL; 
for (size_t i = 0;node[i].next!=NULL; i++) { 
std::cout <<node[i].data<< '\t'; 
} 
std::cout << '\n'; 
for(int i=0;node[i].next->next!=NULL;i++){ 
    if(node[i].data == node[i].next->data){ 
    node[i].next = node[i].next->next; 
} 
} 

for (size_t i = 0;node[i].next!=NULL; i++) { 
std::cout << "Data is " <<node[i].data<< '\t'; 
} 
return 0; 
} 

目标是拆除有序链表 重复我也随机分配0,0,1,1,2,2,3,3,4,4到列表 线节点[ I]的.next =节点[I] .next->接下来不执行与今后我没有得到期望的输出...为什么这个程序无法正常工作,我认为错误在链接列表中?

+0

** C **不甚至有'std :: cout' - 那就是C++。另外:[调试](http://idownvotedbecau.se/nodebugging/)。 –

+0

我建议正确缩进代码,应用编码有帮助的编码风格发现了许多错误。 – Yunnosch

+2

你不要用next来遍历列表。你总是遍历底层数组 - 它永远不会改变 –

回答

1

原始节点数组

 +-------------------------------------------------+ 
data | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | Garbage | 
    +-------------------------------------------------+ 
Next 1 2 3 4 5 6 7 8 9 10 NULL 

设定后下

 +-------------------------------------------------+ 
data | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | Garbage | 
    +-------------------------------------------------+ 
Next 2 2 4 4 6 6 8 8 10 10 NULL 

所以如果你使用下一个指针从头节点到下一个节点 - 你会看到过滤列表

但是既然你使用原始索引方法 - 你仍然可以看到所有的节点。

我下已经显示为索引只是为了说明,而不是真正的指针值 - 那么,你看到下一页== 2 - 这意味着指针前进到阵列成员节点[2]

相关问题