【发布时间】:2011-06-28 01:45:57
【问题描述】:
编辑:找出问题所在。此外,如果您通过 google 或其他搜索引擎发现此问题,这里就是我出错的地方以及如何解决它。
我的 deleteNode() 方法以正确的温度在列表中正确移动,并保持头部不变。我出错的地方是我作为该方法的结果返回的内容。我返回的 temp 或 newNode 不正确,因为它遍历列表直到找到定义的位置。一旦找到定义的位置,它将重新分配 ->next 指针以指向正确的 next->next> 指针,但我又返回了错误的东西。因为我们已经使用 temp/NewNode 在列表中移动了,所以我们丢失了标题,我们正在返回我们找到的位置以及仍然在列表的下一个位置中的任何内容。
我们如何解决这个问题是返回头部(这是传递给方法的内容)。之所以如此,是因为我们必须了解 LinkedLists 是如何工作的。每个节点的指针指向下一个节点。前任。我们有一个链表 |A|| - |B|| - |C|| - |D|| - |E|| - |F||
如果我们想删除节点 C,我们使用 temp 指针移动到节点 B,然后将 B->next 分配给 temp->next->next 从而跳过 C 节点并分配 D 节点。
注意:(据我所知,这实际上并没有释放 C 节点的内存,因此它不是最佳实践,因为这样会导致内存泄漏)您应该在 C 节点上使用 free() 方法。
这是我最终使用的代码
struct node* DeleteNode(struct node* head, int pos) {
struct node* temp = head;
int length = LinkedListLength(temp);
int i;
if(pos <= 0 || pos > length){
printf("ERROR: Node does not exist!\n");
}else{
if(pos == 1){
head = head->next; //move from head (1st node) to second node
}else{
for(i = 1; i < pos-1; ++i){ //move through list
temp = temp->next;
}
temp->next = temp->next->next;
}
}
return head;
}
希望这有助于了解我是如何修复它的。
/////////////////////////////////////// ///////////////////////////////////////// /
///////////////////////////////////////// ////////////////////////////////////////////////
原帖
///////////////////////////////////////// ////////////////////////////////////////////////
///////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// p>
编辑:注意:这是我花了几天时间(估计 4 小时)编写的家庭作业,我只是被困在这一部分上。你可以在下面查看我的尝试
我已经能够从开始/结束插入和删除,但是我似乎无法让位于链接列表中位置 N 的删除节点工作。
我的伪代码如下所示:
- 链表:1,3,5,7,9,23
- 抓取链表
- 创建新结构节点 A = head
- 在链表中移动直到 位置
- 将节点分配给节点->下一步
- 返回链表
示例输入
Node structure
int data;
struct node* next;
int values[] = {1,3,5,7,9,23};
struct node* llist = CreateList(values,6);
llist = DeleteNode(llist, 1);
llist = DeleteNode(llist, 5);
llist = DeleteNode(llist, 3);
一旦代码运行,llist 的值应该是 3、5、9 但是,它将第一个节点替换为 0
实际代码:
struct node* DeleteNode(struct node* head, int pos) {
struct node* temp = head;
struct node* newNode = head;
int length;
int i;
printf("DeleteNode: position = %d \nBefore: ", pos);
PrintList(temp);
if(pos <= 0){ //node does NOT exist
printf("ERROR: Node does not exist!\n");
}else{ //node DOES exist
length = LinkedListLength(temp);
if(length < pos){ //if length < position Node does not exist
printf("ERROR: Node does not exist!\n");
}else{
if(pos == 0){
newNode = temp->next;
}else if(pos == 1){
newNode = temp->next;
}else{
for(i = 1; i < pos; i++){
printf("i = %d\n", i);
temp = temp->next;
newNode->next;
}
if(temp->next == NULL){
newNode = NULL;
}else{
newNode = temp->next;
}
}
printf("After: ");
PrintList(newNode);
printf("\n");
}
}
return newNode;
}
编辑#2:代码错误
提前感谢您的帮助。从我的结论来看,我的问题是我没有正确地浏览列表,但我不确定为什么我没有。
【问题讨论】:
-
想想上面的第一个测试用例会发生什么(当你删除列表中的第一个节点时)。如果你把它画出来,你应该可以看到它......
-
@maerics:是的,这是作业,抱歉我没有说明,但我确实做了多次可靠的尝试。我的机构确实允许帮助,显然不允许复制粘贴。如果它有帮助,我不只是在寻找答案,我实际上很好奇为什么我的代码不起作用,因为据我所知,它应该正确地通过他的列表。
-
@nithins:也许我应该回到只使用 temp 结构而不是使用 newNode ?无论如何,我希望代码
if(pos == 1)做的是检查它的第一个节点是否是,然后将指针移动到第二个节点,这样你就不再有第一个节点 = 1 而是 = 3。第一次检查有效正确(除非它以后会引起问题?) -
这不能直接粘贴您的代码,因为语句
newNode-> = NULL;甚至不会编译。粘贴你实际编译的代码。
标签: c data-structures struct linked-list