我正在尝试实现一个链表数据结构,每个节点都有一个标识符键、一些可变长度的数据(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));"+"(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)的情况。这篇文章的要点是我关于做某事的方法是否正确的问题。
该程序的一个例子是:
-设置ex1 2 3 4 5
-获取ex1
2 3 4 5
-设置ab 32 112
-获取ab
32 112
提前谢谢。
strcpy(temp->key, key);
出于程序的目的,这可能是可以的,但为了安全起见,应该使用strncpy(temp->key,key,5)。或者至少检查一下钥匙的长度,确保它合适。
*(temp->data) = *(val);
这只会设置数组中的第一个索引。你应该在这里使用memcpy。
memcpy (temp->data,val, sizeof (int) * numOfVal);
打印功能打印第一个不匹配的元素。你的意思是反其道而行之吗?
你的删除功能可以做到这一点。它查找第一个不匹配的节点。
您也不想释放currentNode->next;