c - 结构体中指针的 Malloc + 指针算术 + free() + linkedList

标签 c pointers struct linked-list malloc

我正在尝试实现一个链表数据结构,其中每个节点都有一个标识符键、一些可变长度的数据(malloc)和一个指向下一个节点的指针。现在我想要 3 个函数,分别:将新节点设置到列表的前面,使用标识符键打印给定节点的值,以及删除给定节点。

我的节点结构如下:

struct node {
 char key[5];
 int* data;
 node* next;
};
struct node* headNode = NULL;

我对每个功能都有疑问。我将列出我拥有的功能代码,并在下面提出有关该特定功能的问题:

我设置的函数的代码:

void command_set (char key[], int val[], int numOfVal){
 struct node* temp = (node*)malloc(sizeof(node));
 strcpy(temp->key, key);
 temp->data = (int*)malloc(numOfVal*sizeof(int));
 *(temp->data) = *(val);
 temp->next = entry_head;
 entry_head = temp;
 return;
}

现在我有一个关于此功能的问题:

1) 我存储数据的方法有效吗?即“temp->data = (int*)malloc(numOfValuessizeof(int));” +“(临时->数据)= *(val);”。我想做的是动态分配一些内存,然后将给定值作为我的节点数据存储在该内存中。

<小时/>

我的打印功能的代码:

void printNode (char key[], int numOfVal){
 int i;
 struct node *currentNode = headNode;

 while(currentNode->next!=NULL){
     if(!strcmp(currentNode->key,key) ){
        for(i=0; i<numOfVal; i++){
            printf("%d ",*((currentNode->data)+i));
        }
        return;
    }
    currentNode = currentNode->next;
}

我有一个关于此功能的问题:

2)节点的数据是一个整数列表,那么我打印每个整数的方法实际上有效吗?即“*((当前节点->数据)+i)”。我想做的是通过使用指针算术打印存储在数据下的所有整数。

<小时/>

我的删除功能的代码:

void deleteNode (char key[]){
 struct node *currentNode = headNode;
 struct node *prevNode = headNode;
 while(currentNode->next!=NULL){
    if(!strcmp(currentNode->key,key) ){
            prevNode->next = currentNode->next;
            free(currentNode->data);
            free(currentNode->next);
            free(currentNode);
            return;
    }

    prevNode = currentNode;
    currentNode = currentNode->next;
 }

关于此功能我有两个问题:

3)我是否正确“删除”了节点?通过使用 free()。这是这样做的方法吗?

4) 删除后节点就是这样链接的吗?通过将下一个指针设置为另一个节点。

为简单起见,请假设 malloc 不会返回 NULL。另请注意,我已经简化了我的实际代码,否则要发布的内容太多,因此可能会出现轻微错误。您还可以假设 while 循环始终有效(即不会出现 (currentNode->next==NULL) 的情况。这篇文章的要点是我关于做某事的方法是否正确的问题。

该程序的一个示例是:

-设置 ex1 2 3 4 5

-获取ex1

2 3 4 5

-设置 ab 32 112

-获取ab

32112

提前致谢。

最佳答案

strcpy(temp->key, key); 

出于程序的目的,这可能没问题,但为了安全起见,您应该使用 strncpy(temp->key,key,5) 。或者至少检查 key 的长度以确保其合适。

*(temp->data) = *(val);

这仅设置数组中的第一个索引。你应该在这里使用 memcpy 。

memcpy (temp->data,val, sizeof (int) * numOfVal);

您的打印函数打印第一个不匹配的元素。您是想反其道而行之吗?

你的删除函数可以完成这个任务。它找到第一个不匹配的节点。

您也不想释放 currentNode->next;

关于c - 结构体中指针的 Malloc + 指针算术 + free() + linkedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36515604/

相关文章:

c - 在以下情况下,该值是多少?

c# - 遵循不安全的数组索引是否有任何性能差异?

c - 如何使用 C struct 字符串数组避免缓冲区溢出

c - 从 struct 分配给类型 struct * 时不兼容的类型

c++ - 回调参数 C++ 中的协方差

Pebble中将圆分成n等分的点的坐标

c - 将字符存储在字符串变量中

c++ - pthread_create() 是如何工作的?

c++ - 栈帧问题 : Java vs C++

c - While 循环不会在 C 中执行