如何通过函数在数组中进行更改

时间:2017-06-17 16:22:59

标签: c arrays pointers hashtable

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 10

// A hashtable is a mixture of a linked list and array

typedef struct node NODE;

struct node{
    int value;
    NODE* next;
};

int hash(int);                                                   
void insert(int,NODE **);                                       

int main(){

    NODE* hashtable[SIZE];
    insert(12,&hashtable[SIZE]); 
    printf("%d\n",hashtable[5]->value);  


}

int hash(int data){
return data%7;
}

void insert(int value,NODE **table){

    int loc = hash(value);
    NODE* temp = malloc(sizeof(NODE));
    temp->next = NULL;
    temp->value = value;
    *table[loc] = *temp;
    printf("%d\n",table[loc]->value);


}

以上代码打印: 12和 27475674(随机数可能是位置。)

如何让它打印12和12,即如何在阵列中进行更改。我想用数组[5]填充为存储值而创建的节点的位置。

2 个答案:

答案 0 :(得分:3)

表达式*table[loc]等于*(table[loc]),这可能不是您想要的,因为那时您将取消引用未初始化的指针。

然后,分配将*temp的内容复制到一些看似随机的内存中。

然后丢弃刚刚分配的内存导致内存泄漏。

也没有尝试制作哈希桶的链表。

尝试使用初始化hashtable函数中初始创建main数组,以生成指向NULL的所有指针:

NODE* hashtable[SIZE] = { NULL };  // Will initialize all elements to NULL

然后在插入节点时,实际将其链接到bucket-list:

temp->next = table[loc];
table[loc] = temp;

答案 1 :(得分:0)

这只是我对你的程序做的一个简单的改变,它会告诉你你实际上做错了什么。

    #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 10


// A hashtable is a mixture of a linked list and array

typedef struct node NODE;

struct node {
    int value;
    NODE* next;
};

NODE *hashtable[SIZE] = { NULL };

int hash(int);                                                   
int insert(int); //, NODE **);                                       

int main(void)
{
    int loc = insert(12); //, &hashtable[SIZE]); 
    if (loc < SIZE) {
    if (hashtable[loc]) {
        printf("%d\n", hashtable[loc]->value);
    } else {
        printf("err: invalid pointer received\n");
    }
    }

    return 0;
}

int hash(int data)
{
    return data%7;
}

int insert(int value) //, NODE *table[])
{
    int loc = hash(value);
    printf("loc = %d\n", loc);

    if (loc < SIZE) {
    NODE *temp = (NODE *) malloc(sizeof(NODE));
    temp->value = value;
    temp->next  = NULL;
    hashtable[loc]  = temp; 
    printf("%d\n", hashtable[loc]->value);
    }

    return loc;
}

这里我已经全局声明了哈希表,以确保您尝试更新的值对于这两个函数都是可见的。这就是代码中的问题。无论你为temp分配什么新地址都有地址'x',但是你试图从你的main函数访问无效地址。我只想给你一些提示。希望这对你有所帮助。享受!