首页 文章

结构中的指针malloc指针算术free()linkedList

提问于
浏览
0

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

我对该节点的结构如下:

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

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

我的set函数的代码:

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)); " + "(temp-> data)= *(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)节点的数据是整数列表,打印出每个整数的方式实际上是否有效?即“*((currentNode-> data)i)” . 我想要做的是使用指针算法我打印存储在数据下的所有int .


我删除功能的代码:

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)的情况 . 这篇文章的要点是关于做某事的方法是否正确的问题 .

该计划的一个例子是:

-set ex1 2 3 4 5

-get ex1

2 3 4 5

-set ab 32 112

-get ab

32 112

提前致谢 .

1 回答

  • 1
    strcpy(temp->key, key);
    

    为了你的程序的目的,这可能没问题,但你应该使用strncpy(temp-> key,key,5)是安全的 . 或者至少检查钥匙的长度以确保它适合 .

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

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

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

    您的打印功能打印出第一个不匹配的元素 . 你的意思是相反吗?

    你的删除功能可以做到这一点 . 它找到第一个不匹配的节点 .

    你也不想释放currentNode-> next;

相关问题