簡體   English   中英

結構中的指針Malloc +指針算術+ free()+ linkedList

[英]Malloc of pointers in structs + pointer arithmetic + free() + linkedList

我正在嘗試實現一個鏈表數據結構,其中每個節點都有一個標識符鍵,一些可變長度(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(numOfValues sizeof(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循環將始終有效(即,不會出現where(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)保持安全。 或者至少檢查鑰匙的長度以確保它適合。

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

這僅設置數組中的第一個索引。 您應該在這里使用memcpy。

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

您的打印功能將打印不匹配的第一個元素。 你是說相反嗎?

您的刪除功能可以執行此操作。 它找到不匹配的第一個節點。

您也不想釋放currentNode-> next;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM