要注意的地方和代码
在所有操作前一定要先初始化
如果有大佬看到了,有一个问题希望能够解答一下:
这里的malloc要不要free?要free的话,应该在哪呢?
奇怪的地方:当输入的数组个数超过给的长度,又执行了一次main函数,且直接执行了输出操作。。。
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h> //malloc要用的头文件
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10 //储存空间分配增量,自动增长因子
typedef int Elemtype; //ElemType(表不具体类型)和Status都要用typedef定义 ElemType确定了才能用int等
typedef int Status; //typedef后面需要;
#define OVERFLOW -2 //return的也要定义
#define OK 1
#define ERROR 0
typedef struct SqList //构造
{
Elemtype *elem; //存储的是数组第一个元素的地址
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L) //初始化
{
L.elem=(Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(!L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
void Input(SqList &L) //输入
{
int i,n;
cout<<"你想输入几个数:";
cin>>n;
cout<<"请输入:";
for(i=0;i<n;i++)
cin>>L.elem[i]; //输入的数用结构体里的指针表示
L.length=n; //不要忘记了
}
Status ListInsert(SqList &L,int i,Elemtype e) //已经定义了i,后面不要定义了
{
Elemtype *newbase;
cout<<"插入位置:";
cin>>i;
cout<<"想插入的数是:";
cin>>e;
if(i<1||i>L.length+1) return ERROR; //只能在i=1到i=L.length+1合法
//当前存储空间已满,增加分配
if(L.length>=L.listsize)
{
newbase=(Elemtype *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(Elemtype));
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize += LISTINCREMENT;
}
//i=1到i=L.length+1
Elemtype *p=&L.elem[i-1],*q;
for(q=&L.elem[L.length-1];q>=p;q--) //是q--不是p--
*(q+1)=*q;
*p=e;
L.length++;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,Elemtype &e)
{
Elemtype *p,*q;
cout<<"要删除的元素的位置:";
cin>>i;
if((i<1)||(i>L.length)) return ERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p) //前面的++p可以改为p=&(L.elem[i])
*(p-1)=*p;
L.length--;
cout<<"删除的元素是"<<e<<endl;
return OK;
}
Status LocateElem_Sq(SqList L,Elemtype e) //查找,e是要查找的值
{
int i=1;
Elemtype *p=L.elem;
while(i<=L.length&&*p!=e)
{
i++;p++;
}
if(i<=L.length) return i;
else return 0;
}
void Output(SqList L) //输出 不需要int n
{
int i;
cout<<"输出为:";
for(i=0;i<L.length;i++)
cout<<L.elem[i]<<" ";
cout<<endl;
}
void main()
{
int n,i;
Elemtype e;
SqList L; //用结构体定义L
while(1)
{
cout<<"1.初始化"<<endl; //初始化以后才能输入
cout<<"2.输入"<<endl;
cout<<"3.插入"<<endl;
cout<<"4.删除"<<endl;
cout<<"5.查找"<<endl;
cout<<"6.输出"<<endl;
cout<<"7.退出"<<endl;
cout<<"请输入要操作的数字:"<<endl;
cin>>n;
switch(n)
{
case 1:InitList_Sq(L);break;
case 2:Input(L);break;
case 3:ListInsert(L,i,e);break;
case 4:ListDelete_Sq(L,i,e);break;
case 5:
cout<<"请输入要查找的元素:";
cin>>e;
i=LocateElem_Sq(L,e);
if(i==0)
cout<<"查无此元素\n";
else
cout<<"在第"<<i<<"个位置"<<endl;break;
case 6:Output(L);break;
case 7:exit(0);break;
}
}
}