顺序表的各种基本算法问题?

时间:2021-05-28 11:12:57
//文件名:exp2-1.cpp
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50
typedef char elemtype;
typedef struct
{
elemtype date[MAXSIZE];
int len;
}Sqlist;

//初始化顺序表
Sqlist *Initlist(Sqlist *L)
{
L=(Sqlist *)malloc(sizeof(Sqlist));
L->len=0;
return L;
}

//释放顺序表
void Freelist(Sqlist *L)
{
free(L);
}

//判断顺序表L是否为空表
int Listempty(Sqlist *L)
{
return(L->len==0);
}

//返回顺序表L的元素个数
int Listlength(Sqlist *L)
{
return(L->len);
}

//输出顺序表L
void Displist(Sqlist *L)
{
int i;
if(Listempty(L))   return;
for(i=0;i<L->len;i++)
printf("%c",L->date[i]);
printf("\n");
}

//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{

if(i<1||i>L->len)
return 0;
e=L->date+(i-1);
return 1;
}

//在顺序表中查找元素e
int Locateelem(Sqlist *L,elemtype e)
{
int i=0;
while(i<L->len&&L->date[i]!=e)
i++;
if(i>=L->len)
return 0;
else 
return i+1;
}

//在顺序表L中第i个位置上插入元素e
int Listinsert(Sqlist *L, int i, elemtype e)
{
int j;
if(i<1||i>L->len+1)
return 0;
for(j=L->len-1;j>=i-1;j--)
L->date[j+1]=L->date[j];
L->date[i-1]=e;
L->len++;
return 1;
}

//在顺序表L中删除第i个元素
int Listdelete(Sqlist *L,int i)
{
int j;
if(i<1||i>L->len)
return 0;
for(j=i-1;j<L->len-1;j++)
L->date[j]=L->date[j+1];
L->len--;
return 1;
}

//主函数
void main()
{
Sqlist *L=NULL;
elemtype *e=NULL;
printf("(1)初始化顺序表L\n");
L=Initlist(L);
printf("(2)依次采用尾插入法插入a,b,c,d,e元素\n");
Listinsert(L,1,'a');
Listinsert(L,2,'b');
Listinsert(L,3,'c');
Listinsert(L,4,'d');
Listinsert(L,5,'e');
printf("(3)输出顺序表L:");
Displist(L);
printf("(4)顺序表L长度=%d\n",Listlength(L));
printf("(5)顺序表L为%s\n",(Listempty(L)?"空":"非空"));
Getelem(L,3,e);
printf("(6)顺序表L的第3个元素=%c\n",e);
printf("(7)元素a的位置=%d\n",Locateelem(L,'a'));
printf("(8)在第4个元素位置上插入f元素\n");
Listinsert(L,4,'f');
printf("(9)输出顺序表L:");
Displist(L);
printf("(10)删除L的第3个元素\n");
Listdelete(L,3);
printf("(11)输出顺序表L:");
Displist(L);
printf("(12)释放顺序表L\n");
Freelist(L);
}


运行结果:
(1)初始化顺序表L
(2)依次采用尾插入法插入a,b,c,d,e元素
(3)输出顺序表L:abcde
(4)顺序表L长度=5
(5)顺序表L为非空
(6)顺序表L的第3个元素=
(7)元素a的位置=1
(8)在第4个元素位置上插入f元素
(9)输出顺序表L:abcfde
(10)删除L的第3个元素
(11)输出顺序表L:abfde
(12)释放顺序表L

为什么第六步结果出不来????
请求各位高手指点下!!!


谢谢咯!!!!

15 个解决方案

#1


//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{

if(i<1||i>L->len)
return 0;
e=L->date+(i-1);
return 1; //这里是return e吧
}

#2


调用的通过指针传回去的,elemtype *e 不是通过return返回的。就是return 1。

#3


修改方法
//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e= *(L->date+(i-1));
//e = &L->date[i-1];
return 1;
}

main中:
e = (char *)malloc(sizeof(char));
Getelem(L,3,e);
printf("(6)the third elem=%c\n", *e);
分配一个存储空间存放

#4


or:
elemtype e;
Getelem(L,3,&e);
printf("(6)the third elem=%c\n", e);

#5


谢谢楼上高手指点!!!

但是其中有一处不行
就是在:
//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
e = &L->date[i-1];
return 1;
}
这样子运行时结果还是一样,没办法出来!!

只有:
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e= *(L->date+(i-1));
return 1;
}
这样子才可以。。

而对于主函数中的调用,两种方法都行!!

#6


还有一点问题就是,上面的那个程序是我从下面的这个程序改过来的。而下面的这个程序中有个问题看不懂。
麻烦下高手再帮忙看下!!
//文件名:algo2-1.cpp
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 50
typedef char elemtype;
typedef struct
{
elemtype  date[MAXSIZE];
int len;
}Sqlist; //顺序表类型定义

//初始化顺序表
Sqlist *Initlist(Sqlist *L)
{
L=(Sqlist *)malloc(sizeof(Sqlist));
L->len=0;
return L;
}

//释放顺序表
void Freelist(Sqlist *L)
{
free(L);
}

//判断顺序表L是否为空表
int Listempty(Sqlist *L)
{
return(L->len==0);
}

//返回顺序表L的元素个数
int Listlength(Sqlist *L)
{
return(L->len);
}

//输出顺序表L
void Displist(Sqlist *L)
{
int i;
if(Listempty(L))   return;
for(i=0;i<L->len;i++)
printf("%c",L->date[i]);
printf("\n");
}

//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e=*(L->date+(i-1));
return 1;
}

//在顺序表中查找元素e
int Locateelem(Sqlist *L,elemtype e)
{
int i=0;
while(i<L->len&&L->date[i]!=e)
i++;
if(i>=L->len)
return 0;
else 
return i+1;
}

//在顺序表L中第i个位置上插入元素e
int Listinsert(Sqlist *L, int i, elemtype e)
{
int j;
if(i<1||i>L->len+1)
return 0;
for(j=L->len-1;j>=i-1;j--)
L->date[j+1]=L->date[j];
L->date[i-1]=e;
L->len++;
return 1;
}

//在顺序表L中删除第i个元素
int Listdelete(Sqlist *L,int i)
{
int j;
if(i<1||i>L->len)
return 0;
for(j=i-1;j<L->len-1;j++)
L->date[j]=L->date[j+1];
L->len--;
return 1;
}

//文件名:exp2-1.cpp
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50
typedef char elemtype;
typedef struct
{
elemtype date[MAXSIZE];
int len;
}Sqlist;

//调用外部函数
extern Sqlist *Initlist(Sqlist *L);
extern void Freelist(Sqlist *L);
extern int Listempty(Sqlist *L);
extern int Listlength(Sqlist *L);
extern void Displist(Sqlist *L);
extern int Getelem(Sqlist *L,int i,elemtype *e);
extern int Locateelem(Sqlist *L, elemtype e);
extern int Listinsert(Sqlist *L, int i, elemtype e);
extern int Listdelete(Sqlist *L,int i);

//主函数
void main()
{
Sqlist *L;
elemtype e;
printf("(1)初始化顺序表L\n");
L=Initlist(L);
printf("(2)依次采用尾插入法插入a,b,c,d,e元素\n");
Listinsert(L,1,'a');
Listinsert(L,2,'b');
Listinsert(L,3,'c');
Listinsert(L,4,'d');
Listinsert(L,5,'e');
printf("(3)输出顺序表L:");
Displist(L);
printf("(4)顺序表L长度=%d\n",Listlength(L));
printf("(5)顺序表L为%s\n",(Listempty(L)?"空":"非空"));
Getelem(L,3,&e);
printf("(6)顺序表L的第3个元素=%c\n",e);
printf("(7)元素a的位置=%d\n",Locateelem(L,'a'));
printf("(8)在第4个元素位置上插入f元素\n");
Listinsert(L,4,'f');
printf("(9)输出顺序表L:");
Displist(L);
printf("(10)删除L的第3个元素\n");
Listdelete(L,3);
printf("(11)输出顺序表L:");
Displist(L);
printf("(12)释放顺序表L\n");
Freelist(L);
}

其中下面程序中的  }Sqlist;   中出错!!
错误提示是:error C2371:'Sqlist' : redefinition: different basic types


//文件名:exp2-1.cpp
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50
typedef char elemtype;
typedef struct
{
elemtype date[MAXSIZE];
int len;
}Sqlist;

//调用外部函数

#7


改成这样看看
int Getelem(Sqlist *L,int i,elemtype *&e)
{

if(i<1||i>L->len)
return 0;
e=L->date+(i-1);
return 1;
}

#8


不行。
错误提示:
missing ')' before '&'
missing '{' before '&'

#9


楼主从来不结贴啦!!!

#10


问题还没解决,怎么结啊??!!

#11


这是我的第一帖啊!!呵呵……

#12


int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e =  L->date[i-1];
//e=L->date+(i-1);
return 1;
}
函数中e本来要做传出参数,但是,函数中e=L->date+(i-1),是把e指针指向另外的地址,等于丢掉了原来的地址
就无法做传出参数了
函数中应该是给*e赋值才对
另外,建议调用函数时如下使用
char e = '0';
Getelem(L,3,&e);

#13


#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50

typedef char elemtype;

typedef struct
{
elemtype date[MAXSIZE];
int len;
}Sqlist;

//初始化顺序表
Sqlist *Initlist(Sqlist *L)
{
L=(Sqlist *)malloc(sizeof(Sqlist));
L->len=0;
return L;
}

//释放顺序表
void Freelist(Sqlist *L)
{
free(L);
}

//判断顺序表L是否为空表
int Listempty(Sqlist *L)
{
return(L->len==0);
}

//返回顺序表L的元素个数
int Listlength(Sqlist *L)
{
return(L->len);
}

//输出顺序表L
void Displist(Sqlist *L)
{
int i;
if(Listempty(L)) 
return;
for(i=0;i<L->len;i++)
printf("%c",L->date[i]);
printf("\n");
}

//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype **e)
{
if(i<1||i>L->len)
return 0;
*e= (L->date+(i-1));
//e = &L->date[i-1];
return 1;
}

//在顺序表中查找元素e
int Locateelem(Sqlist *L,elemtype e)
{
int i=0;
while(i<L->len&&L->date[i]!=e)
i++;
if(i>=L->len)
return 0;
else
return i+1;
}

//在顺序表L中第i个位置上插入元素e
int Listinsert(Sqlist *L, int i, elemtype e)
{
int j;
if(i<1||i>L->len+1)
return 0;
for(j=L->len-1;j>=i-1;j--)
L->date[j+1]=L->date[j];
L->date[i-1]=e;
L->len++;
return 1;
}

//在顺序表L中删除第i个元素
int Listdelete(Sqlist *L,int i)
{
int j;
if(i<1||i>L->len)
return 0;
for(j=i-1;j<L->len-1;j++)
L->date[j]=L->date[j+1];
L->len--;
return 1;
}

//主函数
int main()
{
Sqlist *L=NULL;
elemtype *e=NULL;
printf("(1)ini L\n");
L=Initlist(L);


Getelem(L,3, &e);
printf("(6)the third elem=%c\n", *e);

printf("(7)a=%d\n",Locateelem(L,'a'));
printf("(8)input f in the 4 th\n");
Listinsert(L,4,'f');
printf("(9)output L:");
Displist(L);
printf("(10)delete the 3rd elem\n");
Listdelete(L,3);
printf("(11)output L:");
Displist(L);
printf("(12)free L\n");
Freelist(L);
return;
}

#14


哈哈,都出来啦。
原来是重复定义
直接把主函数里的那个结构体定义删掉就可以啦!

谢谢楼上高手哦!!

#15


不用谢

#1


//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{

if(i<1||i>L->len)
return 0;
e=L->date+(i-1);
return 1; //这里是return e吧
}

#2


调用的通过指针传回去的,elemtype *e 不是通过return返回的。就是return 1。

#3


修改方法
//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e= *(L->date+(i-1));
//e = &L->date[i-1];
return 1;
}

main中:
e = (char *)malloc(sizeof(char));
Getelem(L,3,e);
printf("(6)the third elem=%c\n", *e);
分配一个存储空间存放

#4


or:
elemtype e;
Getelem(L,3,&e);
printf("(6)the third elem=%c\n", e);

#5


谢谢楼上高手指点!!!

但是其中有一处不行
就是在:
//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
e = &L->date[i-1];
return 1;
}
这样子运行时结果还是一样,没办法出来!!

只有:
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e= *(L->date+(i-1));
return 1;
}
这样子才可以。。

而对于主函数中的调用,两种方法都行!!

#6


还有一点问题就是,上面的那个程序是我从下面的这个程序改过来的。而下面的这个程序中有个问题看不懂。
麻烦下高手再帮忙看下!!
//文件名:algo2-1.cpp
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 50
typedef char elemtype;
typedef struct
{
elemtype  date[MAXSIZE];
int len;
}Sqlist; //顺序表类型定义

//初始化顺序表
Sqlist *Initlist(Sqlist *L)
{
L=(Sqlist *)malloc(sizeof(Sqlist));
L->len=0;
return L;
}

//释放顺序表
void Freelist(Sqlist *L)
{
free(L);
}

//判断顺序表L是否为空表
int Listempty(Sqlist *L)
{
return(L->len==0);
}

//返回顺序表L的元素个数
int Listlength(Sqlist *L)
{
return(L->len);
}

//输出顺序表L
void Displist(Sqlist *L)
{
int i;
if(Listempty(L))   return;
for(i=0;i<L->len;i++)
printf("%c",L->date[i]);
printf("\n");
}

//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e=*(L->date+(i-1));
return 1;
}

//在顺序表中查找元素e
int Locateelem(Sqlist *L,elemtype e)
{
int i=0;
while(i<L->len&&L->date[i]!=e)
i++;
if(i>=L->len)
return 0;
else 
return i+1;
}

//在顺序表L中第i个位置上插入元素e
int Listinsert(Sqlist *L, int i, elemtype e)
{
int j;
if(i<1||i>L->len+1)
return 0;
for(j=L->len-1;j>=i-1;j--)
L->date[j+1]=L->date[j];
L->date[i-1]=e;
L->len++;
return 1;
}

//在顺序表L中删除第i个元素
int Listdelete(Sqlist *L,int i)
{
int j;
if(i<1||i>L->len)
return 0;
for(j=i-1;j<L->len-1;j++)
L->date[j]=L->date[j+1];
L->len--;
return 1;
}

//文件名:exp2-1.cpp
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50
typedef char elemtype;
typedef struct
{
elemtype date[MAXSIZE];
int len;
}Sqlist;

//调用外部函数
extern Sqlist *Initlist(Sqlist *L);
extern void Freelist(Sqlist *L);
extern int Listempty(Sqlist *L);
extern int Listlength(Sqlist *L);
extern void Displist(Sqlist *L);
extern int Getelem(Sqlist *L,int i,elemtype *e);
extern int Locateelem(Sqlist *L, elemtype e);
extern int Listinsert(Sqlist *L, int i, elemtype e);
extern int Listdelete(Sqlist *L,int i);

//主函数
void main()
{
Sqlist *L;
elemtype e;
printf("(1)初始化顺序表L\n");
L=Initlist(L);
printf("(2)依次采用尾插入法插入a,b,c,d,e元素\n");
Listinsert(L,1,'a');
Listinsert(L,2,'b');
Listinsert(L,3,'c');
Listinsert(L,4,'d');
Listinsert(L,5,'e');
printf("(3)输出顺序表L:");
Displist(L);
printf("(4)顺序表L长度=%d\n",Listlength(L));
printf("(5)顺序表L为%s\n",(Listempty(L)?"空":"非空"));
Getelem(L,3,&e);
printf("(6)顺序表L的第3个元素=%c\n",e);
printf("(7)元素a的位置=%d\n",Locateelem(L,'a'));
printf("(8)在第4个元素位置上插入f元素\n");
Listinsert(L,4,'f');
printf("(9)输出顺序表L:");
Displist(L);
printf("(10)删除L的第3个元素\n");
Listdelete(L,3);
printf("(11)输出顺序表L:");
Displist(L);
printf("(12)释放顺序表L\n");
Freelist(L);
}

其中下面程序中的  }Sqlist;   中出错!!
错误提示是:error C2371:'Sqlist' : redefinition: different basic types


//文件名:exp2-1.cpp
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50
typedef char elemtype;
typedef struct
{
elemtype date[MAXSIZE];
int len;
}Sqlist;

//调用外部函数

#7


改成这样看看
int Getelem(Sqlist *L,int i,elemtype *&e)
{

if(i<1||i>L->len)
return 0;
e=L->date+(i-1);
return 1;
}

#8


不行。
错误提示:
missing ')' before '&'
missing '{' before '&'

#9


楼主从来不结贴啦!!!

#10


问题还没解决,怎么结啊??!!

#11


这是我的第一帖啊!!呵呵……

#12


int Getelem(Sqlist *L,int i,elemtype *e)
{
if(i<1||i>L->len)
return 0;
*e =  L->date[i-1];
//e=L->date+(i-1);
return 1;
}
函数中e本来要做传出参数,但是,函数中e=L->date+(i-1),是把e指针指向另外的地址,等于丢掉了原来的地址
就无法做传出参数了
函数中应该是给*e赋值才对
另外,建议调用函数时如下使用
char e = '0';
Getelem(L,3,&e);

#13


#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50

typedef char elemtype;

typedef struct
{
elemtype date[MAXSIZE];
int len;
}Sqlist;

//初始化顺序表
Sqlist *Initlist(Sqlist *L)
{
L=(Sqlist *)malloc(sizeof(Sqlist));
L->len=0;
return L;
}

//释放顺序表
void Freelist(Sqlist *L)
{
free(L);
}

//判断顺序表L是否为空表
int Listempty(Sqlist *L)
{
return(L->len==0);
}

//返回顺序表L的元素个数
int Listlength(Sqlist *L)
{
return(L->len);
}

//输出顺序表L
void Displist(Sqlist *L)
{
int i;
if(Listempty(L)) 
return;
for(i=0;i<L->len;i++)
printf("%c",L->date[i]);
printf("\n");
}

//获取顺序表L中第i个元素
int Getelem(Sqlist *L,int i,elemtype **e)
{
if(i<1||i>L->len)
return 0;
*e= (L->date+(i-1));
//e = &L->date[i-1];
return 1;
}

//在顺序表中查找元素e
int Locateelem(Sqlist *L,elemtype e)
{
int i=0;
while(i<L->len&&L->date[i]!=e)
i++;
if(i>=L->len)
return 0;
else
return i+1;
}

//在顺序表L中第i个位置上插入元素e
int Listinsert(Sqlist *L, int i, elemtype e)
{
int j;
if(i<1||i>L->len+1)
return 0;
for(j=L->len-1;j>=i-1;j--)
L->date[j+1]=L->date[j];
L->date[i-1]=e;
L->len++;
return 1;
}

//在顺序表L中删除第i个元素
int Listdelete(Sqlist *L,int i)
{
int j;
if(i<1||i>L->len)
return 0;
for(j=i-1;j<L->len-1;j++)
L->date[j]=L->date[j+1];
L->len--;
return 1;
}

//主函数
int main()
{
Sqlist *L=NULL;
elemtype *e=NULL;
printf("(1)ini L\n");
L=Initlist(L);


Getelem(L,3, &e);
printf("(6)the third elem=%c\n", *e);

printf("(7)a=%d\n",Locateelem(L,'a'));
printf("(8)input f in the 4 th\n");
Listinsert(L,4,'f');
printf("(9)output L:");
Displist(L);
printf("(10)delete the 3rd elem\n");
Listdelete(L,3);
printf("(11)output L:");
Displist(L);
printf("(12)free L\n");
Freelist(L);
return;
}

#14


哈哈,都出来啦。
原来是重复定义
直接把主函数里的那个结构体定义删掉就可以啦!

谢谢楼上高手哦!!

#15


不用谢