void searchProduct() { int id, i; printf("请输入产品ID: "); scanf("%d", &id); int low = 0; int high = numProducts - 1; int found = 0; while (low <= high) { int mid = (low + high) / 2; if (products[mid].id == id) { found = 1; i = mid; break; } else if (products[mid].id < id) low = mid + 1; else high = mid - 1; } if (found) { printf("找到产品:\n"); printf("ID: %d\n", products[i].id); printf("名称: %s\n", products[i].name); printf("数量: %d\n", products[i].quantity); printf("价格: %d\n", products[i].price); printf("入库时间: %s\n", products[i].day); } else printf("未找到产品.\n");}
使用的时数组,就是顺序存储结构
products[i]这不明显是个数组吗
将数组逆转
//逆转数组
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
while (left < right)
{
int tmp;
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return 0;
}
也可直接将数组反向打印即可
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 9; i >= 0; i--)//注意arr是从arr[0]到arr[9]的,逆向打印赋初值需注意
{
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
输出结果:
问题回答:
在数据结构中使用顺序存储结构的优点有: 1. 存储数据的方式是连续的内存分配,访问数据很快速,时间复杂度为O(1); 2. 优化了读取/写入内存数据的性能;对读取和写入的速度要求高时,性能会更好; 3. 支持随机访问,对于需要访问任意索引元素的情况,顺序存储可以大幅提高效率。
顺序存储结构的缺点如下: 1. 需要预先分配一段连续的空间,会使得空间的利用率比较低; 2. 顺序存储结构中的插入或删除元素比链式结构费时; 3. 在扩充数组时需要重新分配内存,费时费空。
适用情况: 1. 数据集合大小已经确定,不需要经常进行扩充和缩减; 2. 对于元素的访问速度较快,而优先级较低的情况; 3. 数据元素较少且需要随机访问的情况下使用。
与其他存储结构的比较: 1. 与链式存储结构相比,顺序存储结构的访问速度快,但在插入、删除元素和扩充数组时效率低。 2. 与树形结构相比,顺序存储结构处理起来相对简单,但插入和删除元素的性能相对较差。 3. 与散列存储结构相比,顺序存储结构更加节省内存,但无法处理哈希冲突问题。
对于问题二,判断链表中是否有环,我们可以利用快慢指针来判断,代码如下:
bool hasCycle(ListNode head) { ListNode slow = head; ListNode* fast = head;
// 如果fast为空或者指向空,说明不是环形链表
while (fast && fast->next) {
// 慢指针一次走一步,快指针走两步
fast = fast->next->next;
slow = slow->next;
// 如果fast与slow相遇,说明是环形链表
if (fast == slow) {
return true;
}
}
// 出了循环,说明不是环形链表
return false;
}
对于问题三,当有符号数与无符号数相遇时,编译器会自动将有符号数隐式转化为无符号数,因此要特别注意数据类型,避免逻辑判断上的错误。如果需要进行条件判断,建议统一将类型转化为有符号或者无符号数。