bool addNode(Link head) { Link p, q; //p,q两个节点一前一后 Link node; //node指针指向新创建的节点 node = (Link)malloc(sizeof(Node)); inputnews(node); q = head; p = head->next; //q指向head后面的第一个有效节点 if (head->next == NULL) //链表为空时 head->next = node; else { //循环访问链表中的所有节点 while (p != NULL) { if (node->data.num < p->data.num) { //如果node节点的新闻号比p节点的新闻号小,则插在p的前面,完成插入后,提前退出子程序 q->next = node; node->next = p; return true; } else { //如果node节点的新闻号比p节点的新闻号大,继续向后移动指针(依然保持pq一前一后) q = p; p = p->next; } } //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的新闻号是最大值,此时插在链表的最后面 q->next = node; } return true; system("pause"); system("cls"); }分析一下这段代码的运作
时间: 2024-02-29 09:53:57 浏览: 22
这段代码是一个链表的插入节点操作,主要功能是将一个新的节点按照一定的规则插入到链表中。
首先,定义了两个指针p,q,分别指向链表头结点的下一个节点和头结点,因为在插入节点时需要保证q在p的前面,而头结点是不存储数据的,所以q指向头结点,p指向头结点的下一个节点。
然后,定义了一个指针node,用于指向新创建的节点。新节点的数据通过inputnews()函数获取。此处假设新闻号是节点的唯一标识,并且按照从小到大的顺序插入。
接下来,判断链表是否为空。如果为空,则直接将新节点插入到链表的第一个位置。
如果链表不为空,则需要循环遍历链表,查找新节点需要插入的位置。遍历过程中,每次比较新节点的新闻号和当前节点p的新闻号,如果新节点的新闻号小于p节点的新闻号,则将新节点插入到p节点的前面,完成插入后,返回true并退出函数。如果新节点的新闻号大于等于p节点的新闻号,则继续向后遍历链表,直到找到合适的位置或遍历到链表的末尾。
如果在遍历链表的过程中,没有找到合适的位置,则说明新节点的新闻号是最大值,此时将新节点插入到链表的最后面。
最后,返回true表示插入成功,清屏后返回。
相关问题
对于有序单链表,删除重复节点(保留一个/无保留)
对于有序单链表,删除重复节点(保留一个/无保留)的实现方法如下:
1. 保留一个重复节点:遍历链表,如果当前节点的值与下一个节点的值相同,则删除下一个节点,否则继续遍历。
2. 不保留重复节点:遍历链表,如果当前节点的值与下一个节点的值相同,则删除当前节点和下一个节点,否则继续遍历。
以下是删除重复节点(保留一个)的代码实现:
```
void deleteDuplicate(ListNode* head) {
if (head == nullptr) return;
ListNode* cur = head;
while (cur->next != nullptr) {
if (cur->val == cur->next->val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
}
```
以下是删除重复节点(无保留)的代码实现:
```
void deleteDuplicate(ListNode* head) {
if (head == nullptr) return;
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* pre = dummy;
ListNode* cur = head;
while (cur != nullptr) {
bool flag = false;
while (cur->next != nullptr && cur->val == cur->next->val) {
flag = true;
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
if (flag) {
ListNode* tmp = cur;
cur = cur->next;
delete tmp;
continue;
}
pre->next = cur;
pre = pre->next;
cur = cur->next;
}
pre->next = cur;
head = dummy->next;
delete dummy;
}
```
希望能够帮到你!
补全以下函数://删除指定结点 bool DeleteNode(LinkList L, LNode* p) { }
### 回答1:
bool DeleteNode(LinkList L, LNode* p) {
if (L == nullptr || p == nullptr) {
return false;
}
// 找到p结点的前驱结点q
LNode* q = L;
while (q->next != p) {
q = q->next;
if (q == nullptr) {
return false;
}
}
// 删除p结点
q->next = p->next;
free(p);
return true;
}
### 回答2:
补全以下函数:
//删除指定结点
bool DeleteNode(LinkList L, LNode* p) {
if(L == NULL || p == NULL) {
return false; //链表为空或指定结点为空,删除失败
}
//判断要删除的结点是不是头结点
if(L == p) {
L = L->next; //将头结点指向下一个结点
free(p); //释放要删除的结点的内存空间
return true;
}
LNode* prev = L; //保存前一个结点
while(prev->next != p && prev->next != NULL) {
prev = prev->next; //找到要删除结点的前一个结点
}
if(prev->next == NULL) {
return false; //没有找到要删除的结点,删除失败
}
prev->next = p->next; //将前一个结点指向要删除结点的下一个结点
free(p); //释放要删除的结点的内存空间
return true;
}
### 回答3:
补全以下函数:
bool DeleteNode(LinkList L, LNode* p) {
if (L == NULL || p == NULL) { // 判断链表和指定结点是否为空
return false; // 若为空则删除失败
}
if (L == p) { // 若删除的结点为头结点
L = L->next; // 将头结点后移一位
free(p); // 释放删除结点的内存空间
return true;
}
LNode* preNode = L; // 声明一个指向前一个结点的指针
while (preNode->next != NULL && preNode->next != p) {
preNode = preNode->next; // 查找指定结点的前一个结点
}
if (preNode->next == NULL) { // 若找不到指定结点
return false; // 删除失败
}
preNode->next = p->next; // 将前一个结点的指针指向删除结点的下一个结点
free(p); // 释放删除结点的内存空间
return true;
}
这个函数的功能是从单链表中删除指定结点。首先判断链表和指定结点是否为空,如果为空,则删除失败。接着判断要删除的结点是否为头结点,如果是,则将链表的头指针后移一位,释放删除结点的内存空间,返回删除成功。如果不是头结点,则需要查找指定结点的前一个结点,将前一个结点的指针指向删除结点的下一个结点,然后释放删除结点的内存空间,返回删除成功。如果找不到指定结点,则删除失败。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)