Moncel 2022-03-07 08:16 采纳率: 86.7%
浏览 39
已结题

顺序表基本操作中遇到的警告 如何消除

C语言写顺序表操作时遇到的一些警告 这些警告是如何产生的 怎样消除这些警告

这是源文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SqList.h"


int main() {
    SqList A, B, C;
    InitSqList(&A, 5);
    InitSqList(&B, 5);
    InitSqList(&C, 3);
    int i;
    for (i = 0; i < 5; i++) {
        A.elem[i] = i;
        B.elem[i] = i + 1;
        A.length++;
        B.length++;
    }
    Traverlist(&A);
    Traverlist(&B);
    SetDifferenceList(&A,& B,& C);
    //UnionSqList(&B, &A, &C);
    //InterSectionList(&A, &B, &C);
    Traverlist(&C);

}
下面是头文件SqList

```c
#ifndef _SQLIST_H_ //如果没有引入头文件SqList.h
#define _SQLIST_H_

#define ListSpaceIncr 10
#define OVERFLOW 0
#define ERROR 0
#define OK 1
#define FALSE 0
#define TURE 1

typedef int LElemType;
typedef int Status;

Status InitSqList();            //初始化 
Status listIsEmpty();            //判空 
Status listLength();            //求表长 
Status locateElem();            //查找 
Status listInsert();            //插入 
Status listDelete();            //删除 
Status listExchange();            //修改 
void UnionSqList();                //并集 
void InterSectionList();         //交集
void SetDifferenceList();        //差集 
void Traverlist();                //遍历 

typedef struct {
    LElemType* elem;
    int length;
    int listSize;
}SqList;
Status InitSqList(SqList* L, int InitSize) {        //初始化 
    L->elem = (LElemType*)malloc(InitSize * sizeof(LElemType));
    L->length = 0;
    L->listSize = InitSize;
    return OK;
}
Status listIsEmpty(SqList* L) {                //判空 
    if (L->length) {
        return FALSE;
    }
    else return TURE;
}
Status listLength(SqList* L) {                //求表长 
    return L->length;
}
Status locateElem(SqList* L, LElemType e) {  //查找位置 
    int i;
    for (i = 0; i < L->length && L->elem[i] == e; i++);
    if (i < L->length)
        return i + 1;
    else
        return 0;
}
Status listInsert(SqList* L, int i, LElemType e) {                //插入 
    LElemType* base, j;
    if (i < 1 || i>L->length || L == NULL) {
        printf("插入位置错误\n");
        return FALSE;
    }
    if (L->length > L->listSize) {
        base = (LElemType*)realloc(L->elem, (L->listSize + ListSpaceIncr) * sizeof(LElemType));
        L->elem = base;
        L->listSize += ListSpaceIncr;
    }
    for (j = L->length - 1; j > i - 1; j--) {
        L->elem[j] = L->elem[j - 1];
    }
    L->elem[i - 1] = e;
    L->length++;
    return OK;
}
Status listDelete(SqList* L, int i, LElemType* e) {        //删除元素 
    int j;
    if (i < 1 || i > L->length) {
        return 0;
    }
    *e = L->elem[i - 1];
    for (j = i - 1; j < L->length; j++) {
        L->elem[j] = L->elem[j + 1];
    }
    L->length--;
    return OK;
}
Status listExchange(SqList* L, int i, LElemType e) {        //修改元素 
    if (i < 1 || i > L->length)
        return 0;
    L->elem[i - 1] = e;
    return OK;
}
void UnionSqList(SqList* L1, SqList* L2, SqList* L3) {        //并集 
    int l, i, j;
    LElemType* base;
    for (i = 0; i < L1->length; i++) {
        L3->elem[i] = L1->elem[i];
    }
    l = L1->length;
    for (i = 0; i < L2->length; i++) {
        if (L3->length == l) {
            base = (LElemType*)realloc(L3->elem, (L3->listSize + ListSpaceIncr) * sizeof(LElemType));
            L3->elem = base;
            L3->listSize += ListSpaceIncr;
        }
        for (j = 0; j < L1->length && L2->elem[i] != L1->elem[j]; j++)
            if (j == L1->length - 1) {
                L3->elem[l] = L2->elem[i];
                l++;
            }
    }
    L3->length = l;
}
void InterSectionList(SqList* L1, SqList* L2, SqList* L3) {        //交集 
    int i, j, k;
    k = 0;
    for (i = 0; i < L2->length; i++) {
        for (j = 0; j < L1->length; j++) {
            if (L2->elem[i] == L1->elem[j]) {
                L3->elem[k] = L1->elem[j];
                k++;
                break;
            }
        }
    }
    L3->length = k;
}
void SetDifferenceList(SqList* L1, SqList* L2, SqList* L3) {            //差集 
    int i, j, k;
    for (i = 0; i < L1->length; i++) {
        k = 0;
        for (j = 0; j < L2->length; j++) {
            if (L1->elem[i] == L2->elem[j]) {
                k++;
                break;
            }
        }
        if (k == 0)
        {
            L3->elem[L3->length++] = L1->elem[i];
        }
    }
}
void Traverlist(SqList* L) {                    //遍历 
    int i;
    printf("\n==============================================\n");
    for (i = 0; i < L->length; i++)
        printf("第%d个数字是%d\n", i + 1, L->elem[i]);
    printf("==============================================\n");
}

#endif 

报错信息

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/569901216646167.png "#left")

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/579431216646112.png "#left")
  • 写回答

1条回答 默认 最新

  • yun6853992 2022-03-07 09:14
    关注

    没看到你的截图,我在vs2019上试着运行你的代码看了一下相关警告。
    其实这类警告是因为你代码逻辑考虑不够全面导致,具体我看到的有1:
    1:使用指针前的判空,现在编译器太智能,在使用new/malloc的对象前,一般做个判空
    2:在使用数组的时候,要注意数组下标是0~len-1,在操作数组的过程中尽量规避最大,最小,不要有隐含的数组可能越界问题。(这类问题虽然你这个样例ok,但是其他一些测试可能引发崩溃)
    因为数组这块要分析代码修改,我就没细节修改了,你可以思考一下。

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月7日

悬赏问题

  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来