C++顺序表操作,结果后面多出一串数字,找不出具体原因。

C++顺序表的操作
输出结果后面多了一串数字,具体是哪个数组没赋值还是什么原因一直找不到:

#include 
#include 
#include 
#include 
using namespace std;

#define SIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct
{
    Status *elem;
    int length;//内存长度
}SqList;
Status InitList(SqList &L)//初始化
{
    L.elem=new ElemType[SIZE];
    if(!L.elem) exit(OVERFLOW);
    L.length=0;
    return OK;
}

//起始创造目标线性表
void CreatList(SqList &L,int a[],int n)
{
    for(int i=0;iL.elem[i]=a[i];
    }
    L.length=n;
}

//计算线性表的长度
Status ListLength(SqList &L)
{
    int n=0;
    int p = L.elem[n];
    while(p!=0)
    {
        n++;
    }
    return n;
}

//进行元素的删除
Status ListDelete(SqList &L,int i)
{
    if(i<1||i>L.length) return ERROR;
    for (int j=i;j<=L.length-1;j++)
        L.elem[j-1]=L.elem[j];
    --L.length;
    return OK;
}

Status GetElem(SqList &L,int i,ElemType &e)//取值
{
    if (i<1||i>L.length)
        return ERROR;
    e=L.elem[i-1];
    return OK;
}
//查找值,或可以查找是否有重复值
Status LocateElem(SqList L,ElemType e)
{
    for(int i=0; i<L.length; i++)
        if(L.elem[i]==e)
            return i+1;
    return 0;
}


//将值插入目标位置i
Status ListInsert(SqList &L,int i, ElemType e)
{
    if((i<1)||(i>L.length+1)) return ERROR; //无效位置
    if(L.length==SIZE) return ERROR;//满储存
    for(int j=L.length-1;j>=i-1;j--)
        L.elem[j+1]=L.elem[j];//将i后面的元素全部后移
    L.elem[i-1]=e;
    ++L.length;
    return OK;
}
//打印线性表
Status PrintList(SqList &L)
{
    for(int i=0;i<L.length;i++)
    {
        cout<<L.elem[i]<<" ";
    }
    cout<//进行集合的交集
void InterList(SqList LA, SqList LB,SqList &LC)
{
     int e=0,a2=0;
     for(int i=0;i<LB.length;i++)
     {
         GetElem(LB,i+1,e);
         if(LocateElem(LA,e))
         {
            ListInsert(LC,a2+1,e);
            a2++;
         }
     }
     if(a2>0)
     {
        cout<<"集合AB的交集为:"<<PrintList(LC)<else
        cout<<"AB无交集"<//进行集合的并集
void  MergeList(SqList &LA, SqList LB)
{
//    Status m = ListLength(LA); Status n = ListLength(LB);
    Status m = LA.length;
    int e=0;
    for(int i=0;i<LB.length;i++)
    {
        GetElem(LB,i+1,e);
        if(!LocateElem(LA,e))
        {
            ListInsert(LA,++m,e);
        }
    }
    cout<<"集合AB的并集为: "<<PrintList(LA)<//进行集合的差集
void  ChaList(SqList &LD,SqList LC)
{

    for(int i=0;i<LC.length;i++)
    {
        Status m=LocateElem(LD, LC.elem[i]);
        ListDelete(LD,m);
    }
    cout<<"集合AB的差集为:"<<PrintList(LD)<Status Distory(SqList &L)
{
    if(L.elem)
        delete []L.elem;
    L.length=0;
    L.elem=NULL;
}
int main()
{
    SqList LA,LB,LC,LD;
    InitList(LC);
    InitList(LA);
    InitList(LD);
    InitList(LB);//初始化

    int a1=2,b1=3;
    ElemType a[a1]={1,2};
    CreatList(LA,a,a1);//创建线性表
    cout<<"创建表A: ";PrintList(LA);
    cout<<"增加元素:3"<ListInsert(LA,LA.length+1,3);
    cout<<"A: ";PrintList(LA);LD=LA;
    ElemType b[b1]={1,5,6};
    CreatList(LB,b,b1);//创建线性表
    cout<<"创建表B:";PrintList(LB);
    InterList(LA,LB,LC);
    MergeList(LA,LB);
    ChaList(LD,LC);
    return 0;
}



img

根据你提供的代码,问题可能在ListLength函数中。该函数未正确计算表中元素的数量,因为在while循环中没有更新p变量,导致循环无限进行,最终返回一个非预期的值。你可以尝试使用以下代码替换ListLength函数中的代码:


int ListLength(SqList &L)
{
    return L.length;
}

此外,你的PrintList函数返回了一个Status类型的值,而它的返回类型应该是void。你可以尝试使用以下代码替换PrintList函数中的代码:


void PrintList(SqList &L)
{
    for(int i=0;i<L.length;i++)
    {
        cout<<L.elem[i]<<" ";
    }
    cout<<endl<<"----------------------------------------"<<endl;
}

望采纳🥰🥰🥰

“Devil组”引证GPT后的撰写:

  • 在 PrintList 函数中,它的返回值类型是 Status,但是它却返回了一个值为 void 的函数 cout,导致输出 PrintList(LC) 时后面多了一串数字,实际上这个数字是输出的 cout 函数的返回值,即输出字符的数量。

为了解决这个问题,你需要将 PrintList 函数的返回值类型改为 void,也就是不需要返回任何值,只需要执行输出即可。代码如下:

void PrintList(SqList &L)
{
    for(int i=0;i<L.length;i++)
    {
        cout<<L.elem[i]<<" ";
    }
    cout<<endl<<"----------------------------------------"<<endl;
}