以下算法用于在带头结点的单链表h中查找第一个值为x的结点,找到后返回其逻辑序号(从1计起),否则返回0。分析该算法存在的问题并修改代码。 int findx(LNode *h,int x) { LNode *p=h->next; int i=0; while (p->data!=x) { i++; p=p->next; } return i; }
时间: 2023-03-23 16:03:59 浏览: 54
该算法存在的问题是:在while循环中,没有判断p是否为空,如果p为空,则会出现空指针异常。
修改后的代码如下:
int findx(LNode *h, int x) {
LNode *p = h->next;
int i = 1; // 逻辑序号从1开始计算
while (p != NULL && p->data != x) { // 判断p是否为空
i++;
p = p->next;
}
if (p == NULL) { // 如果p为空,则表示未找到值为x的结点
return ;
} else {
return i;
}
}
相关问题
设计一个算法,查找带头结点的非空单链表L中第一个最大结点(最大结点可能有多个),并返回该结点的逻辑序号。
1. 初始化最大结点的逻辑序号为1,最大值为头结点的下一个结点的数据域;
2. 从头结点的下一个结点开始遍历单链表,如果当前结点的数据域大于最大值,则更新最大值和最大结点的逻辑序号;
3. 继续遍历直到链表末尾,返回最大结点的逻辑序号。
代码实现:
```
int findMaxNodePosition(ListNode* L) {
int maxPos = 1;
int maxVal = L->next->val;
ListNode* p = L->next;
int pos = 1;
while (p != nullptr) {
if (p->val > maxVal) {
maxVal = p->val;
maxPos = pos;
}
p = p->next;
pos++;
}
return maxPos;
}
```
设计一个算法,查找带头结点的非空单链表l中第一个最大结点(最大结点可能有多个),并返回该结点的逻辑序号。
算法如下:
1. 定义一个变量max记录当前最大值,初始值为l的第一个结点的值,定义一个变量index记录当前最大值的逻辑序号,初始值为1。
2. 从l的第二个结点开始遍历整个链表,如果当前结点的值大于max,则更新max为当前结点的值,同时更新index为当前结点的逻辑序号。
3. 遍历完整个链表后,返回index即可。
代码实现:
int findMaxNode(Node* l) {
int max = l->next->data;
int index = 1;
Node* p = l->next->next;
int i = 2;
while (p != NULL) {
if (p->data > max) {
max = p->data;
index = i;
}
p = p->next;
i++;
}
return index;
}
阅读全文