cur->next = cur->next->next;和cur=cur->next;有什么区别
时间: 2023-06-10 16:03:24 浏览: 323
这两个操作有很大的区别。cur->next = cur->next->next; 的作用是将 cur 的下一个节点指针指向下下个节点,相当于删除了当前节点的下一个节点;而 cur=cur->next; 的作用是将 cur 指向它的下一个节点,相当于向链表的下一个节点移动了一个位置。
相关问题
#include <iostream> #include "listnode.h" using namespace std; /*struct listNode { listNode * prev, * next; int val; listNode(): val(0), prev(nullptr), next(nullptr){} listNode(int v, listNode *p, listNode *n): val(v), prev(p), next(n) { if (prev != nullptr) prev->next = this; if (next != nullptr) next->prev = this; } };*/ class OrderedList { protected: listNode * root; public: OrderedList(){root=new listNode();} ~OrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;} delete cur;} virtual void insert(int val)=0; void printList() const { listNode* cur=root; while(cur->prev!=nullptr)cur=cur->prev; while(cur!=nullptr){cout<<cur->val<<' ';cur=cur->next;} cout<<endl; } }; class AscendOrderedList:public OrderedList { public: AscendOrderedList(){root=new listNode();} ~AscendOrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;} delete cur;} void insert(int v) { if(root->next==nullptr&&root->prev==nullptr){root->val=v;return;} listNode* pre = root; while(pre->prev!=nullptr)pre=pre->prev; if(v<=pre->val){listNode*ins=new listNode();ins->val=v;ins->next=pre;return;} while (pre->next != nullptr && v > pre->val) { pre = pre->next; } listNode*a=pre->next; listNode*ins=new listNode(v, pre, pre->next); ins->prev=pre;ins->next=a; } }; class DescendOrderedList:public OrderedList { public: DescendOrderedList(){root=new listNode();} ~DescendOrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;} delete cur;} virtual void insert(int v){ if(root->next==nullptr&&root->prev==nullptr){root->val=v;return;} listNode*pre=root; while(pre->prev!=nullptr)pre=pre->prev; if(v>=pre->val){listNode*ins=new listNode();ins->val=v;ins->next=pre;return;} while(v<pre->val&&pre!=nullptr){pre=pre->next;} listNode*a=pre->next; listNode*ins=new listNode(v, pre, pre->next); ins->prev=pre;ins->next=a; } };输出错误
在代码中,构造函数和析构函数中的删除操作存在问题。在析构函数中,应该先删除链表中的节点,再删除root节点,否则会造成内存泄漏。同时,在构造函数中,应该将root节点的prev和next指针设为nullptr,否则会导致插入操作时出现问题。另外,在DescendOrderedList的insert函数中,应该先判断pre是否为nullptr,否则在pre为nullptr时会出现访问pre->val的错误。
给出每一行的详细解释://删除结点 void delPoint() { //2个结点以上才删除 if (pHead == NULL || pHead->next == NULL) { return; } struct Point* pre = pHead; struct Point* cur = pHead->next; while (cur->next != NULL) { pre = pre->next; cur = pre->next; } setWall(cur->x, cur->y, ' '); printChar(cur->y * 2, cur->x, ' '); free(cur); cur = NULL; pre->next = NULL; }
这段代码定义了一个名为 delPoint 的函数,用于删除链表的最后一个节点。
第四至第七行代码判断链表的头指针 pHead 是否为空,或者链表只有一个节点,如果是,则直接返回,不进行任何操作。
第九和第十行代码定义了两个指向结构体 Point 的指针变量 pre 和 cur,分别指向链表的头节点和下一个节点。
第十二至第十四行代码使用 while 循环遍历链表,直到找到最后一个节点,此时 cur 指向最后一个节点,pre 指向倒数第二个节点。
第十六和第十七行代码使用 setWall() 函数将最后一个节点的坐标位置标记为空格,并使用 printChar() 函数将该位置打印为空格。
第十八行代码使用 free() 函数释放最后一个节点所占用的内存空间,并将 cur 指针置为 NULL。
第十九行代码将 pre 节点的 next 指针置为 NULL,即将倒数第二个节点作为最后一个节点,完成删除操作。
因此,该函数的作用是删除链表的最后一个节点,并将其所占用的内存空间释放掉,防止内存泄漏。
阅读全文