你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿
这篇文章看的人还挺多,我顺便写了顺序栈的,不过只发了个总代码
顺序栈
1、 创建顺序表
2、 按数值查找
3、 按位置查找
4、 插一个数值
5、 删一个数值
6、 销毁顺序表
7、 求前驱算法
8、 求后继算法
#include
#include
#include
#define LIST_MaxSize 1000//该顺序表最大的数量
typedef int ElemType;//给int定义一个别名
typedef enum Status{
success,fail,NoCreate//success表示成功,fail表示失败,NoCreate表示顺序表还未创建
}Status;
Status status;//定义status这个枚举变量,status是表明顺序表基本操作的状态``
typedef struct Sqlist
{
int *elem;//元素
int length;//元素个数,即长度
}Sqlist;
Status List_Init(Sqlist *L)
{
int i;
L->elem=(ElemType *)malloc(LIST_MaxSize*sizeof(ElemType));//要开辟多余的空间是为了后面的插入算法
/*我这里采用的是取0~100的随机数,方便检测程序的对错,也可以手动输入*/
srand(time(0)); //时间取种
for(i=0;i<L->length;i++)
{
L->elem[i]=rand()%101;
}
if(L->elem)//若成功申请内存
{
for(i=0;i<L->length;i++)
{
printf("%d\n",L->elem[i]);
}
return success;
}
return fail;
}
Status List_Locate(Sqlist *L,ElemType elem,int *pos,int *count)//count是用于记录相同数值出现的次数
{
int len=L->length,i=0,flag=0;
if(len==0)return NoCreate;
while(i<len)
{
if(L->elem[i]==elem)
{
if(*count==0)flag=i;
*count=(*count)+1;
}
i++;
}
if(*count!=0)
{
*pos=flag;
return success;
}
return fail;
}
Status List_Retrieve(Sqlist *L,ElemType *elem,int *pos)
{
if(0<=*pos&&*pos<=L->length)
{
*elem=L->elem[*pos-1];
return success;
}
return fail;
}
Status List_Insert(Sqlist *L,ElemType elem,int pos)//第pos个元素换为elem
{
int i;
for(i=L->length-1;i>=pos-1;i--)
{
L->elem[i+1]=L->elem[i];//数据元素后移一位
}
L->elem[pos-1]=elem;
L->length++;
return success;
}
Status List_Remove(Sqlist *L,int pos)
{
int i;
for(i=pos-1;i<L->length-1;i++)
{
L->elem[i]=L->elem[i+1];
}
L->length--;
return success;
}
Status List_Destroy(Sqlist *L)
{
if(status==NoCreate)
{
printf("您还没有创建顺序表!请先创建顺序表\n");
}
if(L->elem)
{
free(L->elem);
L->elem=NULL;
L->length;
return NoCreate;
}
}
Status List_Prior(Sqlist *L,int pos)
{
ElemType elem;
if(1<pos&&pos<=L->length)
{
elem=L->elem[pos-1-1];
printf("前驱数值为:%d\n",elem);
return success;
}
return fail;
}
Status List_Next(Sqlist *L,int pos)
{
ElemType elem;
if(1<pos&&pos<=L->length-1)
{
elem=L->elem[pos-1-1];
printf("后继数值为:%d\n",elem);
return success;
}
return fail;
}
#include
#include
#include
#define LIST_MaxSize 1000
//顺序表的最大元素个数
/*可以自行修改宏定义*/
typedef int ElemType;
typedef enum Status{
success,fail,NoCreate
}Status;
Status status;//定义status这个枚举变量,status是表明顺序表基本操作的状态
typedef struct Sqlist
{
int *elem;//元素
int length;//元素个数,即长度
}Sqlist;
/*1、创建顺序表*/
Status List_Init(Sqlist *L)
{
int i;
L->elem=(ElemType *)malloc(LIST_MaxSize*sizeof(ElemType));//要开辟多余的空间是为了后面的插入
/*我这里采用的是取0~100的随机数,方便检测程序的对错*/
srand(time(0));
for(i=0;i<L->length;i++)
{
L->elem[i]=rand()%101;
}
if(L->elem)
{
for(i=0;i<L->length;i++)
{
printf("%d\n",L->elem[i]);
}
return success;
}
return fail;
}
/*2、按按数值查找算法(加强一下,可以找到出现多次的数值)*/
Status List_Locate(Sqlist *L,ElemType elem,int *pos,int *count)
{
int len=L->length,i=0,flag=0;
if(len==0)return NoCreate;
while(i<len)
{
if(L->elem[i]==elem)
{
if(*count==0)flag=i;
*count=(*count)+1;
}
i++;
}
if(*count!=0)
{
*pos=flag;
return success;
}
return fail;
}
/*3、按位置查找*/
Status List_Retrieve(Sqlist *L,ElemType *elem,int *pos)
{
if(0<=*pos&&*pos<=L->length)
{
*elem=L->elem[*pos-1];
return success;
}
return fail;
}
/*4、插入一个数值*/
Status List_Insert(Sqlist *L,ElemType elem,int pos)//第pos个元素换为elem
{
int i;
for(i=L->length-1;i>=pos-1;i--)
{
L->elem[i+1]=L->elem[i];//数据元素后移一位
}
L->elem[pos-1]=elem;
L->length++;
return success;
}
/*5、删除一个数值*/
Status List_Remove(Sqlist *L,int pos)
{
int i;
for(i=pos-1;i<L->length-1;i++)
{
L->elem[i]=L->elem[i+1];
}
L->length--;
return success;
}
/*6、销毁顺序表*/
Status List_Destroy(Sqlist *L)
{
if(status==NoCreate)
{
printf("您还没有创建顺序表!请先创建顺序表\n");
}
if(L->elem)
{
free(L->elem);//释放申请的空间
L->elem=NULL;//置为空指针,保证使用安全
L->length=0;//长度变为0
return NoCreate;
}
}
/*7、求前驱算法*/
Status List_Prior(Sqlist *L,int pos)
{
ElemType elem;
if(1<pos&&pos<=L->length)
{
elem=L->elem[pos-1-1];
printf("前驱数值为:%d\n",elem);
return success;
}
return fail;
}
/*8、求后继算法*/
Status List_Next(Sqlist *L,int pos)
{
ElemType elem;
if(1<pos&&pos<=L->length-1)
{
elem=L->elem[pos-1-1];
printf("后继数值为:%d\n",elem);
return success;
}
return fail;
}
int main()
{
printf("------------------提示:该顺序表最大能存1000个元素------------------\n\n");
int i,pos,count=0,n;
status=NoCreate;
Sqlist L;
L.length=0;//空表,此时还未创建顺序表
ElemType elem;
printf("****************1、 创建顺序表\t");
printf("2、 按数值查找****************\n");
printf("****************3、 按位置查找\t");
printf("4、 插一个数值****************\n");
printf("****************5、 删一个数值\t");
printf("6、 销毁顺序表****************\n");
printf("****************7、 求前驱算法\t");
printf("8、 求后继算法****************\n");
printf("****************9、 菜单的选项\t");
printf("10、展示顺序表****************\n");
printf("****************11、顺序表个数\t");
printf("12、结束该程序****************\n");
while(1)
{
scanf("%d",&n);
switch(n)
{
case 1: {
printf("您想初始化这个顺序表多少个元素呢?(随机数):");
scanf("%d",&L.length);
if(L.length>LIST_MaxSize)
{
printf("元素个数超过了最大值!\n");
break;
}
status=List_Init(&L);
if(status==success)
{
printf("顺序表初始化成功!\n");
}
if(status==fail) printf("顺序表初始化失败!\n");
break;
}
case 2: {
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else
{
printf("请输入你想要查找的数值:");
scanf("%d",&elem);
status=List_Locate(&L,elem,&pos,&count);
if(status==success)
{
printf("找到了!第一次出现在第%d个位置,共出现了%d次\n",pos+1,count);
}
else printf("您输入的数值不在顺序表之中!\n");
}
break;
}
case 3: {
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else
{
printf("按位置查找,你查的数字序号为:");
scanf("%d",&pos);
status=List_Retrieve(&L,&elem,&pos);
if(status==success)
{
printf("该数值为:%d\n",elem);
}
else printf("您输入的序号越界了!\n");
}
break;
}
case 4: {
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else
{
printf("请输入您想插入的元素位置:");
scanf("%d",&pos);
if(pos>L.length||L.length==LIST_MaxSize)
{
printf("您插入的元素超出了您创建顺序表的范围!\n");
break;
}
printf("请输入您想插入的元素数值:");
scanf("%d",&elem);
status=List_Insert(&L,elem,pos);
if(status==success) printf("插入成功!\n");
else printf("插入不成功!\n");
}
break;
}
case 5: {
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else
{
printf("请输入您想删除的元素位置:");
scanf("%d",&pos);
if(pos>L.length||L.length==LIST_MaxSize)
{
printf("您删除的元素超出了您创建顺序表的范围!\n");
break;
}
status=List_Remove(&L,pos);
if(status==success)printf("删除成功!\n");
}
break;
}
case 6: {
status=List_Destroy(&L);
if(status==NoCreate) printf("销毁成功!\n");
status=NoCreate;
break;
}
case 7: {
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else
{
printf("请输入元素位置:");
scanf("%d",&pos);
status=List_Prior(&L,pos);
if(status==fail)printf("该位置无前驱!\n");
}
break;
}
case 8: {
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else
{
status=List_Next(&L,pos);
if(status==fail)printf("该位置无后继!\n");
}
break;
}
case 9: {
printf("--------------------------------------------------------------\n");//分割线
printf("****************1、 创建顺序表\t");
printf("2、 按数值查找****************\n");
printf("****************3、 按位置查找\t");
printf("4、 插一个数值****************\n");
printf("****************5、 删一个数值\t");
printf("6、 销毁顺序表****************\n");
printf("****************7、 求前驱算法\t");
printf("8、 求后继算法****************\n");
printf("****************9、 菜单的选项\t");
printf("10、展示顺序表****************\n");
printf("****************11、顺序表个数\t");
printf("12、结束该程序****************\n");
printf("--------------------------------------------------------------\n");//分割线
break;
}
case 10:{
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else
{
printf("-----------------------------------\n");//分割线
for(i=0;i<L.length;i++)
{
printf("%d\n",L.elem[i]);
}
printf("-----------------------------------\n");//分割线
}
break;
}
case 11:{
if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");
else printf("顺序表的元素个数为:%d\n",L.length);
break;
}
case 12:{
printf("再见,祝您生活幸福愉快!");
return 0;
}
default:{
printf("请输入1~12内的整数!\n");
break;
}
}
count=0;//用完一次后重置
pos=0; //用完一次后重置
}
}
主函数的设计由大家自己发挥即可,只要能够表明顺序表的基本操作的一个状态并对该状态作出一个提示信息,都是一个好程序。
我今天第一次做完这个顺序表,可能代码有很多啰嗦的地方,我水平有限,请朋友们谅解!写的不好的地方还请朋友们指出。
最后,如果这篇文章对你有帮助,就点个赞或者评论一下吧,谢谢!
你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿