void DoubleLinkAddTail(DOUBLE_LINK* pDblLnk, DOUBLE_NODE* pNode) {//pNode:new node assert(IsValidDoubleLink(pDblLnk)); assert(IsValidDoubleNode(pDblLnk, pNode)); if(pDblLnk == NULL || pNode == NULL) return; if(pDblLnk->pTail == NULL) // First node; { assert(pDblLnk->pHead == NULL); pDblLnk->pHead = pNode;//set head pNode->pPrev = NULL;//head node does not have prev node } else//not first node; { assert(pDblLnk->pHead != NULL); pDblLnk->pTail->pNext = pNode;//set link relation between old tail and new node pNode->pPrev = pDblLnk->pTail; } //add pNode to tail pNode->pNext = NULL; pDblLnk->pTail = pNode; pDblLnk->dwCurNodeNums++; return; }什么意思
时间: 2024-04-21 18:27:20 浏览: 115
这段代码实现了双向链表的尾部添加操作,函数名为DoubleLinkAddTail。参数包括一个DOUBLE_LINK类型的指针pDblLnk,表示要添加节点的双向链表,以及一个DOUBLE_NODE类型的指针pNode,表示要添加的节点。
函数首先通过assert断言判断pDblLnk和pNode是否有效。如果其中有一个为空,则直接返回。
如果pDblLnk中没有节点,即pDblLnk的pTail为空,则表示这是链表的第一个节点,将pNode设置为链表的头节点,同时将头节点的pPrev指针设置为NULL。
如果pDblLnk中已经有节点,则将原来的尾节点的pNext指针指向pNode,将pNode的pPrev指针指向原来的尾节点。然后将pNode的pNext指针设置为NULL,将pNode设置为新的尾节点。
最后,将pDblLnk中记录的节点数量加1,函数返回。
相关问题
DOUBLE_NODE* DoubleLinkGetPrev(const DOUBLE_LINK* pDblLnk, const DOUBLE_NODE* pNode) { assert(IsValidDoubleLink(pDblLnk)); assert(IsValidDoubleNode(pDblLnk, pNode)); return pNode->pPrev; }什么意思
这是一个函数的定义,函数名为DoubleLinkGetPrev,它返回一个DOUBLE_NODE类型的指针。该函数的作用是获取双向链表中指定节点的前一个节点。
具体而言,该函数的第一个参数pDblLnk是一个指向DOUBLE_LINK类型的指针,表示要获取前一个节点的双向链表。函数首先使用assert函数检查pDblLnk指针所指向的对象是否为有效的双向链表。
该函数的第二个参数pNode是一个指向DOUBLE_NODE类型的指针,表示要获取前一个节点的节点。函数同样使用assert函数检查pNode指针所指向的对象是否为有效的双向链表节点。
最后,该函数直接返回pNode节点中的pPrev成员,即该节点的前一个节点的指针。需要注意的是,如果pNode指向的是双向链表的头节点,则返回的指针可能为空指针。
6-7 移动链表中的最大值到尾部 分数 10 编写函数MoveMaxToTail(),实现查找单链表中值最大的结点,并将其移动到链表尾部,注意其他结点的相对次序不变。要求尽量具有较高的时间效率。 例如输入8 12 46 30 5,输出为8 12 30 5 46 函数接口定义: void MoveMaxToTail (LinkList H ); 裁判测试程序样例: #include<stdio.h> #include<stdlib.h> typedef int DataType; struct Node { DataType data; struct Node* next; }; typedef struct Node *PNode; typedef struct Node *LinkList; void MoveMaxToTail(head); LinkList SetNullList_Link() { LinkList head = (LinkList)malloc(sizeof(struct Node)); if (head != NULL) head->next = NULL; else printf("alloc failure"); return head; } void CreateList_Tail(struct Node* head) { PNode p = NULL; PNode q = head; DataType data; scanf("%d", &data); while (data != -1) { p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; p->next = NULL; q->next = p; q = p; scanf("%d", &data); } } void MoveMaxToTail (LinkList H ) { @@ } void print(LinkList head) { PNode p = head->next; while (p) { printf("%d ", p->data); p = p->next; } } void DestoryList_Link(LinkList head) { PNode pre = head; PNode p = pre->next; while (p) { free(pre); pre = p; p = pre->next; } free(pre); } int main() { LinkList head = NULL; head = SetNullList_Link(); CreateList_Tail(head); MoveMaxToTail(head); print(head); DestoryList_Link(head); return 0; }
下面是实现 MoveMaxToTail 函数的代码:
```c
void MoveMaxToTail (LinkList H ) {
if (H == NULL || H->next == NULL) return; // 链表为空或只有一个结点,直接返回
PNode p = H->next, maxNode = p, preMaxNode = H; // p 从第一个结点开始,maxNode 记录最大值结点,preMaxNode 记录前驱结点
while (p->next) { // 从第二个结点开始遍历
if (p->next->data > maxNode->data) {
maxNode = p->next; // 更新最大值结点
preMaxNode = p; // 更新前驱结点
}
p = p->next;
}
if (maxNode != p) { // 若最大值结点不是尾结点
preMaxNode->next = maxNode->next; // 从链表中删除最大值结点
maxNode->next = NULL; // 将最大值结点置为尾结点
p->next = maxNode; // 将最大值结点插入到尾结点后面
}
}
```
该函数的时间复杂度为 O(n),其中 n 是链表的长度。
阅读全文