所以我正在尝试实现一个从链表中删除节点的函数。
这是我的主要内容:
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;
}
}
我哪里出错了?
答案 0 :(得分:5)
我注意到size_t i
中的getNodeListLength
未初始化为任何值 - 这可能是意外尺寸报告的来源。
此外,您从列表中删除jank
,但您的jank
指针仍然指向该节点(即使它已经free
'd) - 这意味着使用{{ 1}}之后访问不再属于你的内存!
答案 1 :(得分:1)
试
//modify this method
size_t getNodeListLength(NODE* start)
{
size_t i = 0;
while(start != NULL)
{
start = start -> next;
i++;
}
return i;
}
答案 2 :(得分:0)
原来我的错误是在这个函数中:
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;
}