[英]Linked List Delete Node
因此,我正在尝试实现从链接列表中删除节点的功能。
这是我的主要资料:
int main(void)
{
NODE* first = generateNodes(5);
NODE* jank = getNode(first, 2);
deleteNode(first,2);
printf("Length of Node List: %d\n",getNodeListLength(first));
printf("First Node: %d\n",first -> pos);
printf("Jank Node: %d\n",jank -> pos);
return 0;
}
这是我的输出:
Length of Node List: 2
First Node: 0
Jank Node: 2
输出应该是(因为在main()
我删除了jank
,并将链接列表的大小减小了一个):
Length of Node List: 4
First Node: 0
Jank Node: NULL
这是我的整个源代码:
#include <stdio.h>
#include <stdlib.h>
/* NODE STRUCTURE */
typedef struct node{
char* thing;
int pos; /* Index of node */
struct node* next; /* Pointer to next node */
} NODE;
/* Generates a single node */
NODE* generateNode();
/* Generates linked nodes and returns the first node */
NODE* generateNodes(int num);
/* Gets a node at a certain index */
NODE* getNode(NODE* start, int index);
/* Returns the length of a list of nodes */
size_t getNodeListLength(NODE* start);
/* Removes a node at a certain index */
NODE* deleteNode(NODE* start, int index);
int main(void)
{
NODE* first = generateNodes(5);
NODE* jank = getNode(first, 2);
deleteNode(first,2);
printf("Length of Node List: %d\n",getNodeListLength(first));
printf("First Node: %d\n",first -> pos);
printf("Other Node: %d\n",jank -> pos);
return 0;
}
NODE* generateNode()
{
return (NODE*) malloc(sizeof(NODE));
}
NODE* generateNodes(int num)
{
NODE* one = generateNode();
NODE* cpy = one;
int i;
for(i = 0; i < num - 1; i++)
{
NODE* next = generateNode();
cpy -> next = next;
cpy -> pos = i;
cpy = next;
}
cpy -> pos = i;
cpy -> next = NULL;
return one;
}
NODE* getNode(NODE* start, int index)
{
int i;
for(i = 0; i < index; i++)
{
start = start -> next;
}
return start;
}
size_t getNodeListLength(NODE* start)
{
size_t i;
while(start -> next != NULL)
{
start = start -> next;
i++;
}
return i - 1;
}
NODE* deleteNode(NODE* start, int index)
{
if(index > 0)
{
NODE* f = getNode(start,index - 1);
NODE* l = getNode(start,index + 1);
NODE* d = getNode(start,index);
f -> next = l;
free(d);
return start;
}
if(index == 0)
{
NODE* up = start -> next;
free(start);
return up;
}
if(index + 1 == getNodeListLength(start))
{
NODE* r = getNode(start,index);
NODE* c = getNode(start,index - 1);
c -> next = NULL;
free(r);
return start;
}
}
我哪里做错了?
我注意到getNodeListLength
的size_t i
没有初始化为任何值-这可能是意外大小报告的来源。
此外,您删除jank
从列表中,但你jank
指针仍然指向到节点(即使它已经free
“d) -这意味着使用jank
正在访问内存不再是你的了!
尝试
//modify this method
size_t getNodeListLength(NODE* start)
{
size_t i = 0;
while(start != NULL)
{
start = start -> next;
i++;
}
return i;
}
原来我的错误是在此功能:
size_t getNodeListLength(NODE* start)
{
size_t i;
while(start -> next != NULL)
{
start = start -> next;
i++;
}
return i - 1;
}
应该:
size_t getNodeListLength(NODE* start)
{
size_t i = 1;
while(start -> next != NULL)
{
start = start -> next;
i++;
}
return i;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.