void InsertDLinkList(DLinkList& L) { DNode* m = L; int temp; cout << "请输入要添加的数值." << endl; cin >> temp; while (temp != -1) { DNode* n = (DNode*)malloc(sizeof(DNode)); if (n == NULL) { cout << "内存不足,分配失败" << endl; return; } n->next = m->next; n->prior = m; n->data = temp; m->next = n; m = m->next; cin >> temp; }
时间: 2023-07-30 21:12:25 浏览: 89
这段代码实现了双向链表的插入操作。在函数`InsertDLinkList`中,通过输入要添加的数值,将其插入到双向链表中。
首先,定义一个指针`m`指向链表头节点`L`。
然后,通过循环输入要添加的数值,直到输入-1为止。在循环中,首先创建一个新的节点`n`,并进行内存分配。如果内存分配失败,则输出提示信息并返回。
接下来,将新节点`n`插入到链表中。将`n`的next指针指向`m`的next指针所指向的节点,将`n`的prior指针指向`m`,将`n`的data值设置为输入的数值。然后,将`m`的next指针指向`n`,更新`m`为当前节点。
最后,在每次循环结束后,再次输入要添加的数值。
这样就完成了双向链表的插入操作。
相关问题
void InsertDNode(DLinkList& L, int a, int b) { DNode* temp = (DNode*)malloc(sizeof(DNode)); temp->next = NULL; temp->prior = NULL; temp->data = b; if (temp == NULL) { cout << "内存不足,分配失败" << endl; return; } DNode* n = L; while (a != 1) { n = n->next; a--; } temp->prior = n; temp->next = n->next; n->next = temp; }
这段代码实现了在双向链表中指定位置插入节点的操作。在函数`InsertD`中,通过参数`a`指定要插入的位置,参数`b`定要插入的节点数据。
首先,一个新的节点`temp`,并进行内存分配。将`temp`的next和prior指针初始化为NULL,将`temp`的data值设置为输入的数值。
然后,判断内存分配是否成功。如果分配失败,则输出提示信息并返回。
接下来,定义一个指针`n`指向链表头节点`L`。
通过循环,将指针`n`移动到要插入位置的前一个节点。循环条件是当`a`不等于1时,即还未移动到要插入位置前一个节点。在循环中,将指针`n`向后移动一位,并将`a`减1。
然后,将新节点`temp`插入到链表中。将`temp`的prior指针指向节点`n`,将`temp`的next指针指向节点`n->next`,将节点`n->next`的prior指针指向节点`temp`,最后将节点`n`的next指针指向节点`temp`。
这样就完成了在双向链表中指定位置插入节点的操作。
void DeleteDNode_Value(DLinkList& L, int a) { if (LengthList(L) == 0) { cout << "双链表为空" << endl; return; } DNode* p = L->next; DNode* q = L; while (p != NULL) { if (p->data == a) { if (p->next == NULL) { q->next = p->next; free(p); } else { q->next = p->next; p->next->prior = q; free(p); } return; } p = p->next; q = q->next; } cout << "没找到该数值" << endl; } 双链表删除元素(按位删除) void DeleteDNode_Pos(DLinkList& L, int a) { if (LengthList(L) == 0) { cout << "双链表为空" << endl; return; } if (a > LengthList(L)) { cout << "位序过大" << endl; return; } DNode* p = L->next; DNode* q = L; int pos = 1; while (pos < a) { p = p->next; q = q->next; pos++; } if (pos == a) { q->next = p->next; free(p); } else { q->next = p->next; p->next->prior = q; free(p); } }
这段代码是关于双链表删除操作的实现。其中包含了两个函数,分别是按值删除和按位删除。
函数DeleteDNode_Value根据给定的值a,在双链表L中查找并删除第一个值为a的节点。首先判断双链表是否为空,如果为空则输出"双链表为空"并返回。然后设置两个指针p和q,分别指向双链表的第一个节点和头节点。通过循环遍历双链表,当找到值为a的节点时进行删除操作。如果找到的节点是最后一个节点,则将前一个节点的next指针置为NULL,并释放该节点的内存。否则,将前一个节点的next指针指向待删除节点的下一个节点,同时将下一个节点的prior指针指向前一个节点,最后释放待删除节点的内存。
函数DeleteDNode_Pos根据给定的位序a,在双链表L中查找并删除第a个节点。首先判断双链表是否为空,如果为空则输出"双链表为空"并返回。然后判断位序a是否超过了双链表的长度,如果超过则输出"位序过大"并返回。设置两个指针p和q,分别指向双链表的第一个节点和头节点,并设置一个变量pos记录当前节点的位序。通过循环遍历双链表,当pos等于a时进行删除操作。如果找到的是最后一个节点,则将前一个节点的next指针置为NULL,并释放该节点的内存。否则,将前一个节点的next指针指向待删除节点的下一个节点,同时将下一个节点的prior指针指向前一个节点,最后释放待删除节点的内存。
需要注意的是,这段代码中使用了free函数来释放节点的内存。在实际编程中,可能需要根据具体情况使用delete或者delete[]来释放内存,以避免内存泄漏问题。另外,该代码中没有给出LengthList函数的实现,需要根据实际情况进行实现。
阅读全文