怎么我的输出结果总是少一个数?改好久还是不行

题目:用顺序表求两集合的交集


#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define error 0
#define ok 1
typedef int status;

#define listinitsize 100
#define listincrement 10
typedef char elemtype;
typedef struct{
    elemtype *elem;
    int length;
    int listsize;
}sqlist ;

status initlist(sqlist &l)//构造一个空的线性表L 
{
    l.elem=(elemtype *)malloc(listinitsize*sizeof(elemtype));
    if(!l.elem) exit(error);//存储分配失败 
    l.length=0;
    l.listsize=listinitsize;//初始存储容量 
    return ok;
}

//顺序表实验4个辅助函数:
status inputlist(sqlist &l)//顺序表输入
{ int i,n;
  //printf("please input the length of the sqlist:");
  scanf("%d",&n);
  l.length=n;
  //printf("please input the data of the sqlist:");
  for (i=0;i<=l.length-1;i++) scanf("%d",&l.elem[i]);
  return ok;
}

status  listtraverse(sqlist l)//顺序表输出
{ int i;
  printf("the length of the sqlist:");
  printf("%d\n",l.length);
  printf("the data of the sqlist:");
  for (i=0;i<=l.length-1;i++) printf("%d ",l.elem[i]);
  printf("\n");
  return ok;
}

status destroylist(sqlist &l)//顺序表撤销
 { free(l.elem);
   l.length=0;
   l.listsize=0;
   return ok;
 }

status clearlist(sqlist &l)//顺序表重置
 { 
   l.length=0;
   return ok;
 }
 
 int locateelem(sqlist l,elemtype e)//判定 
 {   int a;
     for(int i=0;i<l.length;i++)
     {
         if(l.elem[i]==e)
        return i+1;
         //else cout<<"error"<<endl;
        
     } 
      return error;
 }
/*
 {
     for(int i=1;i<listlength(la);i++)
     {
         getelem(la,i,e);
         if(locateelem(lb,e)!=0)
         insertlist(lc,listlength(lc)+1,e);
     }
 }
 */
 status  getelem(sqlist l,int i, elemtype &e)
 {
     if(i<1||i>l.length+1) return error;
     else 
     e=l.elem[i-1]; 
    return ok; 
 }
  status listinsert(sqlist &l,int i,elemtype e) 
 {
     elemtype *newbase,*q,*p;
     if(i<1||i>l.length+1) return error;
     if(l.length>=l.listsize)
     {
         newbase=(elemtype*)realloc(l.elem,(l.listsize+listincrement)*sizeof(elemtype));
         if(!newbase) exit(error);
         l.elem=newbase;
         l.listsize+=listincrement;
     }
     q=&(l.elem[i-1]);
     for(p=&(l.elem[l.length-1]);p>=q;--p)  *(p+1) =*p;
     *q=e;
     ++l.length;
     return ok;
} 
 int main()
{
    sqlist la,lb,lc;
    initlist(la);
    inputlist(la);
    initlist(lb);
    inputlist(lb);
    initlist(lc);
    elemtype e;
    for(int i=1;i<la.length;i++)
     {
         getelem(la,i,e);
         //if(locateelem(la,e)==0)
         listinsert(lc,lc.length+1,e);
     }
    listtraverse(lc);
    destroylist(la);
    destroylist(lb);
    destroylist(lc);
    return 0;
}

img

我自己改过来了,这个是正确的


    for(int i=1;i<=la.length;i++)
     {
         getelem(la,i,e);
         if(locateelem(lb,e)!=0)//        if(locateelem(lb,e)!=0)
         listinsert(lc,lc.length+1,e);
     }
for(int i=1;i<la.length;i++)
     {
         getelem(la,i,e);
         //if(locateelem(la,e)==0)
         listinsert(lc,lc.length+1,e);
     }

for循环都要从0开始啊,你为什么要从1开始

题主的代码没什么问题,主函数里作了修改,可以正确实现功能,供参考:

int main()
{
    sqlist la, lb, lc;
    initlist(la);
    inputlist(la);
    initlist(lb);
    inputlist(lb);
    initlist(lc);
    elemtype e;
    for (int i = 0; i < la.length; i++)//for(int i = 1; i < la.length; i++)
    {
        getelem(la, i+1, e);  //getelem(la, i, e);
        if(locateelem(lb,e)!=0)// if(locateelem(la,e)==0)
           listinsert(lc, lc.length + 1, e);
    }
    listtraverse(lc);
    destroylist(la);
    destroylist(lb);
    destroylist(lc);
    return 0;
}