gpt4 book ai didi

C - 将数组传递给链表的节点

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:19 26 4
gpt4 key购买 nike

我有一个已填充整数的二维数组,准备切割成行并进行处理,我需要将每一行(一维数组)传递给链表的一个节点。每个节点看起来像这样:

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

以这种方式添加和链接新节点:

struct node *addnode(int *val, struct node *next, int columns)
{
struct node *tnode;
tnode = (struct node*)malloc(sizeof(*tnode));
if(tnode != NULL) {
tnode->val = malloc(sizeof(int) * columns);
memcpy(tnode->val, val, sizeof(int) * columns);
tnode->val = val;
tnode->next = next;
};
return tnode;
}

将填充每个节点的程序片段大致如下所示:

int table[rows][columns], i, j;
for (i = 0; i < rows; i++){
head = addnode(*table, head, columns);
for (j = 0; j < columns; j++){
scanf("%d",&table[i][j]);
head->val[j] = table[j];
printf("%d ",head->val[j]);
};
puts("\n");
};

我不确定如何在指示的地方进行:

  1. 那是整个节点的 malloc,但是我应该如何处理 val 的 malloc?我知道每个节点中应该有的表的长度,它是 columns,在 main 函数中获取。我应该在哪里为其分配内存?
  2. 此行上方是我为单行整数分配足够()内存的地方。这是一个不错的选择吗?
  3. 这个,在前面的循环中应该用足够的 i 行二维数组 table 填充当前的 head->val[j],但它看起来太好了是真实的。我可以就这样离开吗?

编辑:我在某些地方更正了它,但在尝试对其进行排序后,它返回垃圾。我将在这里转储大部分代码:

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

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

struct node *addnode(int *val, struct node *next, int columns);
struct node *mergesort(struct node *head, int column);
struct node *merge(struct node *head_one, struct node *head_two, int column);

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

struct node *head;
struct node *current;
struct node *next;
int symbol = 0;
int columns = 0;
//int columns = atoi(argv[1]); //until sorting works, I'll keep it at 0
int rows = 0;
head = NULL;
int column = 0; //temporary until I find the way to send one argument during executing it under linux like so 'name_of_program columns < test.txt'
int lastSpace = 0;

do {
symbol = fgetc(stdin);

if (rows == 0 && (lastSpace == 0 && (isspace(symbol) || feof(stdin)))) {
columns++;
lastSpace = 1;
} else if (!isspace(symbol)) {
lastSpace = 0;
}
if (symbol == '\n' || feof(stdin)) {
rows++;
};
} while (symbol != EOF);

if (ferror(stdin))
{
printf("Error on reading from file.\n");
} else {
printf("The file contains %d row(s) and %d column(s).\n", rows, columns);
};

rewind(stdin); //I have heard conflicting opinions on that, but in this case it works, and in the end it's a school project, not commercial code

int table[rows][columns], i, j;
for (i = 0; i < rows; i++){
head = addnode(*table, head, columns);
for (j = 0; j < columns; j++){
scanf("%d",&table[i][j]);
head->val[j] = table[i][j];
printf("%d ",head->val[j]);
};
puts("\n");
};


head = mergesort(head, column);

for(current = head; current != NULL; current = current->next){
for (j = 0; j < columns; j++){
printf("%d ", current->val[j]);
};
puts("\n");
};

for(current = head; current != NULL; current = next)
next = current->next, free(current);
return 0;
};


struct node *addnode(int *val, struct node *next, int columns)
{
struct node *tnode;
tnode = (struct node*)malloc(sizeof(*tnode));
if(tnode != NULL) {
tnode->val = malloc(sizeof(int) * columns);
memcpy(tnode->val, val, sizeof(int) * columns);
tnode->val = val;
tnode->next = next;
};
return tnode;
}

struct node *mergesort(struct node *head, int column)
{
struct node *head_one;
struct node *head_two;
if((head == NULL) || (head->next == NULL))
return head;
head_one = head;
head_two = head->next;
while((head_two != NULL) && (head_two->next != NULL)) {
head = head->next;
head_two = head->next->next;
};
head_two = head->next;
head->next = NULL;
return merge(mergesort(head_one, column), mergesort(head_two, column), column);
}

struct node *merge(struct node *head_one, struct node *head_two, int column)
{
struct node *head_combined;
if(head_one == NULL)
return head_two;
if(head_two == NULL)
return head_one;
if(head_one->val[column] < head_two->val[column]) {
head_combined = head_one;
head_combined->next = merge(head_one->next, head_two, column);
} else {
head_combined = head_two;
head_combined->next = merge(head_one, head_two->next, column);
};
return head_combined;
}

我在 Unix 中运行它是这样的:

name_of_program < test.txt

test.txt 的结构为 http://pastebin.com/WL5brutf

最佳答案

1) 您正在将 int *val 传递给函数,并在节点中使用它本身。如果你想丢弃传递给函数的 val 并想保留它的另一个副本,你需要 malloc 内存。正如您所说,您知道数组中有多少个元素,因此您可以分配那么多元素,只需将内存从 val 复制为

 tnode->val = malloc(sizeof(int) * num_of_elements); //replace num_of_elements with appropriate variable/constant
memcpy(tnode->val, val, sizeof(int) * num_of_elements);

2) 是的,这是正确的地方。

3) 是的,您可以用这种方式为 head 指向的当前节点赋值。您可能希望在 j for 循环结束后移动到下一个节点并在其 val 中分配新值。

关于C - 将数组传递给链表的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16941633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com