user-0 提问: 关于结构体数组中的内容无法遍历输出的问题

回复:
user: user-0
content: 我找到错的地方了…… while（）循环中我用了n n 循环到 0后， 又在 for中用了…n

user: user-0
content: 谢谢大家的帮助。 我属实比较菜，前辈们的指点让我受益良多… 为了不耽误大家的时间，我决定明天晚上/下午结贴… 谢谢大家了~

user: user-0
content: 引用 13 楼 apkipa1 的回复:我自己写了一份代码， OJ 上提交通过，不知道你能否看得懂。(另外: 例如 int n; int arr[n]; 这种是利用了 C99 的 VLA 特性，C++ 与 msvc 不支持)  #include <stdbool.h> #include <stdlib.h> #include <string.h> #include <stdio.h>  enum { 	INVALID_NODE_PTR = -1, };  typedef int NodePtr_t;  #define ENTRY_NODE_PTR 100000  int n, k; struct tagNode { 	NodePtr_t next; 	int data; } nodes[100000 + 5];  NodePtr_t walk_steps(NodePtr_t node, int nSteps) { 	while (node != INVALID_NODE_PTR && nSteps > 0) { 		node = nodes[node].next; 		nSteps--; 	} 	return node; }  void print_nodes(void) { 	NodePtr_t nodeCur = nodes[ENTRY_NODE_PTR].next; 	while (nodeCur != INVALID_NODE_PTR) { 		printf("%05d %d ", nodeCur, nodes[nodeCur].data); 		if (nodes[nodeCur].next == INVALID_NODE_PTR) 			printf("-1\n"); 		else 			printf("%05d\n", nodes[nodeCur].next); 		nodeCur = nodes[nodeCur].next; 	} }  void transform(void) { 	NodePtr_t nodeNext, nodeTmps[5];  	nodeNext = ENTRY_NODE_PTR; 	for (;;) { 		nodeTmps[0] = nodeNext; 		nodeNext = walk_steps(nodeNext, k); 		if (nodeNext == INVALID_NODE_PTR) 			return;  		for (int i = 2; i <= k; i++) { 			nodeTmps[1] = walk_steps(nodeTmps[0], i - 1); 			nodeTmps[2] = walk_steps(nodeTmps[0], i); 			nodeTmps[3] = walk_steps(nodeTmps[0], i + 1); 			nodes[nodeTmps[2]].next = nodes[nodeTmps[0]].next; 			nodes[nodeTmps[1]].next = nodeTmps[3]; 			nodes[nodeTmps[0]].next = nodeTmps[2]; 		}  		nodeNext = walk_steps(nodeNext, k - 1); 	} }  int main(void) { 	scanf("%d%d%d", &nodes[ENTRY_NODE_PTR].next, &n, &k); 	for (int i = 1; i <= n; i++) { 		int a; 		scanf("%d", &a); 		scanf("%d%d", &nodes[a].data, &nodes[a].next); 	}  	transform(); 	print_nodes();  	return 0; }   非常感谢您花费的时间和精力！ 然而我是个新新新新新手……您的代码我只能看懂一部分… 我努力学着看懂吧 再一次感谢您

user: user-1
content: 我自己写了一份代码， OJ 上提交通过，不知道你能否看得懂。(另外: 例如 int n; int arr[n]; 这种是利用了 C99 的 VLA 特性，C++ 与 msvc 不支持)  #include <stdbool.h> #include <stdlib.h> #include <string.h> #include <stdio.h>  enum { 	INVALID_NODE_PTR = -1, };  typedef int NodePtr_t;  #define ENTRY_NODE_PTR 100000  int n, k; struct tagNode { 	NodePtr_t next; 	int data; } nodes[100000 + 5];  NodePtr_t walk_steps(NodePtr_t node, int nSteps) { 	while (node != INVALID_NODE_PTR && nSteps > 0) { 		node = nodes[node].next; 		nSteps--; 	} 	return node; }  void print_nodes(void) { 	NodePtr_t nodeCur = nodes[ENTRY_NODE_PTR].next; 	while (nodeCur != INVALID_NODE_PTR) { 		printf("%05d %d ", nodeCur, nodes[nodeCur].data); 		if (nodes[nodeCur].next == INVALID_NODE_PTR) 			printf("-1\n"); 		else 			printf("%05d\n", nodes[nodeCur].next); 		nodeCur = nodes[nodeCur].next; 	} }  void transform(void) { 	NodePtr_t nodeNext, nodeTmps[5];  	nodeNext = ENTRY_NODE_PTR; 	for (;;) { 		nodeTmps[0] = nodeNext; 		nodeNext = walk_steps(nodeNext, k); 		if (nodeNext == INVALID_NODE_PTR) 			return;  		for (int i = 2; i <= k; i++) { 			nodeTmps[1] = walk_steps(nodeTmps[0], i - 1); 			nodeTmps[2] = walk_steps(nodeTmps[0], i); 			nodeTmps[3] = walk_steps(nodeTmps[0], i + 1); 			nodes[nodeTmps[2]].next = nodes[nodeTmps[0]].next; 			nodes[nodeTmps[1]].next = nodeTmps[3]; 			nodes[nodeTmps[0]].next = nodeTmps[2]; 		}  		nodeNext = walk_steps(nodeNext, k - 1); 	} }  int main(void) { 	scanf("%d%d%d", &nodes[ENTRY_NODE_PTR].next, &n, &k); 	for (int i = 1; i <= n; i++) { 		int a; 		scanf("%d", &a); 		scanf("%d%d", &nodes[a].data, &nodes[a].next); 	}  	transform(); 	print_nodes();  	return 0; }

user: user-0
content: 引用 10 楼 wowpH 的回复: 我一个字没改。VS中直接报错。 ------------------------------------------------------- 1、如果问题已经得到解决，请及时结贴。结贴教程。 2、如果没有解决，可继续追问。 3、只能在电脑网页上结贴，手机不能结贴。 CSDN论坛新手指南 ------------------------------------------------------- 谢谢您的回复 尚未得到满意的答案暂不结帖  另：我用的是 Dev C++,并没有出现报错…

user: user-0
content: 引用 9 楼 apkipa1 的回复:试了一下，你的程序直接崩溃了，所以没有输出。这题目的意思应该是让你模拟链表操作吧，你写成这个样子我没看懂。  谢谢您的回复  题目的大概意思就是给你几个无序的结点，然后让你按照他们的首位地址相连排序，最后输出。 我的代码主要思想就是： 先创建一个结构体列表存储输入的无序结点 再遍历第一个数组，根据首尾地址相连排序放在新创建的一个结构体数组里 最后将第二个数组输出…  语言表达能力有限……emmmmmm  主要的疑问就是为啥 for 循环没法将结构体数组输出

user: user-2
content: 我一个字没改。VS中直接报错。 ------------------------------------------------------- 1、如果问题已经得到解决，请及时结贴。结贴教程。 2、如果没有解决，可继续追问。 3、只能在电脑网页上结贴，手机不能结贴。 CSDN论坛新手指南 -------------------------------------------------------

user: user-1
content: 试了一下，你的程序直接崩溃了，所以没有输出。这题目的意思应该是让你模拟链表操作吧，你写成这个样子我没看懂。

user: user-0
content: 引用 7 楼 user-3的回复:  红色部分是怎么来的 那些都是输入...

user: user-3
content: 红色部分是怎么来的

user: user-0
content: 引用 5 楼 user-3 的回复:没试了一下，确实可以这样赋值。 同时仔细看了看，你的行动结果和测试样例是一样的呀，你说的是哪个没有输出 图片中的所有数据都是我的输入…… 代码中的 for 循环没有输出

user: user-3
content: 没试了一下，确实可以这样赋值。 同时仔细看了看，你的行动结果和测试样例是一样的呀，你说的是哪个没有输出

user: user-0
content: 引用 3 楼 user-3 的回复:list[j] = temp[i];  C中结构体变量可以这样赋值吗。在JAVA, C#中确实可以这样做，但是以C中时不可以的  我刚刚看了翁恺的课，好像可以的吧……

user: user-3
content: list[j] = temp[i];  C中结构体变量可以这样赋值吗。在JAVA, C#中确实可以这样做，但是以C中时不可以的

user: user-0
content: 引用 1 楼 user-3 的回复:linked_list temp[n],list[n];     在C中不能这样动态声明数组，如果要这样定义数组，那么其中的N必须为常量。动态声明数组要使用malloc 谢谢您的指点，学到了学到了 但是，我之前很多代码都是用这样的方法进行初始化一个数组的，在上一行的代码中已经 scanf( " " ,&n ) 了，运行都没有报错…… 而且，该题目的答案代码也是这般定义 请问还有没有是别的地方存在问题？ 谢谢

user: user-3
content: linked_list temp[n],list[n];     在C中不能这样动态声明数组，如果要这样定义数组，那么其中的N必须为常量。动态声明数组要使用malloc