是否采用顺序存储结构

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]这不明显是个数组吗

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/801807
  • 你也可以参考下这篇文章:随意修改位置指针指向
  • 除此之外, 这篇博客: 逆转数组中的 逆转数组 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 将数组逆转

    //逆转数组
    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;
    }
    

    输出结果:
    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    问题回答:

    在数据结构中使用顺序存储结构的优点有: 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;
    

    }

    对于问题三,当有符号数与无符号数相遇时,编译器会自动将有符号数隐式转化为无符号数,因此要特别注意数据类型,避免逻辑判断上的错误。如果需要进行条件判断,建议统一将类型转化为有符号或者无符号数。