数结构顺序表基本操作C语言/c++实现
作为一个大学生的我开始学数据结构非常困惑,因为C语言的基础也不是太好,本人读的大学是个二本,学校的教学,我想和我一样读的二本的同学都懂,读大学很多时候都是要靠自学的,刚开始学数据结构,看到那些代码都是一脸懵,不知到怎么运行怎么应用,后来一直在网上找答案,怎么去运行那些代码,我学的是C语言,而书本的是c++的,C语言不兼容C语言的,在网上也能找到C语言的,但格式和书上的有点不太一样,后来我总结,终于慢慢学会了,现在我自己写了和书本上的格式相似的,容易看懂,供那些像我一样学习理解较慢的同学参考,其中 参考了大部分代码总结写成
望同学们有自己的思考见解发在评论下
#代码中有一个删除的功能有点问题,如果有知道怎么解决的大神请告诉我一下。。
欢迎加入指导讨论
//用c语言实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ERROR -1
#define OK 1
typedef int Status;
typedef int ElemType;
//类型定义
typedef struct
{
ElemType *elem;
int length;
}SqList;
//初始化线性表
Status InitList(SqList *L)
{
L->elem=(ElemType*)malloc(sizeof(ElemType));
if(!L->elem) exit(ERROR);
L->length=0;
return OK;
}
//销毁线性表
Status DestroyList(SqList *L)
{
if(L->elem)
{free(L->elem);
L->elem=0;
}
return OK;
}
//清空线性表
Status ClearList(SqList *L)
{
L->length=0;
return OK;
}
//判断线性表是否为空
Status ListEmpty(SqList *L)
{
if(L->length==0) return OK;
else return ERROR;
}
//求线性表长度
Status LengthList(SqList L)
{
return (L.length);
}
//获取线性表中第i个元素内容
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0||i<1||i>L.length)
return ERROR;
*e=L.elem[i-1];
return OK;
}
//在线性表中第i个元素之前插入数据e
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if(L->length==MAXSIZE||!L->elem)
return ERROR;
if(i<1||i>L->length+1)
return ERROR;
if(i<=L->length)
{
for(k=L->length;k>=i-1;k--)
L->elem[k+1]=L->elem[k];
}
L->elem[i-1]=e;
L->length++;
return OK;
}
//将线性表中第i个元素删除
Status ListDelete(SqList *L,int i,ElemType *e)
{
int k;
if(L->length==0)
return ERROR;
if(i<1||i>L->length+1)
return ERROR;
*e=L->elem[i-1];
if(i<L->length)
for(k=i;k<L->length;k++)
L->elem[k-1]==L->elem[k];
L->length--;
return OK;
}
//打印顺序表
Status ListTraverse(SqList *L)
{
int i;
if(!L->elem) return ERROR;
else
for(i=0;i<L->length;i++)
{
printf("%4d",L->elem[i]);
}
printf("\n");
}
//找指定元素的位置
int LocateElem(SqList L,ElemType e)
{
int i;
if(L.length==0) return ERROR;
for(i=0;i<L.length;i++)
{
if(L.elem[i]==e)
break;
}
if(i>=L.length)
return 0;
}
//两个线性表合并
void unionL(SqList *La,SqList Lb)
{
int La_len,Lb_len,i;
ElemType e;
La_len=LengthList(*La);
Lb_len=LengthList(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);
if(!LocateElem(*La,e))
ListInsert(&La,++La_len,e);
}
}
int main()
{
SqList L;
SqList Lb;
ElemType e;
Status i;
int j,k,select,longest;
printf("************************\n");
printf("1、初始化顺序表 2、元素插入\n3、在某个位置插入 4、在某个位置删除\n5、清空顺序表 6、显示顺序表当前长度\n7、判断顺序表是否为空 8、打印顺序表\n9、销毁顺序表 10、找第几个元素\n0、退出\n");
printf("************************\n");
while(1)
{ printf("请输入选择:");
scanf("%d",&select);
if(select==0) break;
switch(select)
{
case 1://初始化
{i=InitList(&L);
if(i==1)
printf("分配成功!\n");
else if(i==0)
printf("分配失败!");
}break;
case 2://插入
{
printf("想要插入多少个元素:");
scanf("%d",&longest);
printf("请输入元素:\n");
for(k=1;k<=longest;k++)
{ scanf("%d",&j);
i=ListInsert(&L,k,j);
}
if(i==1)
printf("插入成功!\n");
else if(i==0)
printf("插入失败");
}break;
case 3://在某个位置插入
{
printf("要插入的位置插入:");
scanf("%d",&j);
printf("\n");
printf("要插入的元素:");
scanf("%d",&k);
i=ListInsert(&L,j,k);
if(i==1)
printf("插入成功!\n");
else if(i==0)
printf("插入失败");
}break;
case 4://在某个位置删除
{
int o;
printf("要删除的位置:");
scanf("%d",&o);
printf("\n");
i=ListDelete(&L,o,&k);
if(i==1)
printf("删除成功!\n");
else if(i==0)
printf("删除失败\n");
printf("删除的元素是:%d\n",k);
}break;
case 5://清空顺序表
{
i=ClearList(&L);
if(i==1) printf("顺序表已清空!\n");
}break;
case 6://显示顺序表当前长度
{
printf("顺序表长当前度为:%d",L.length);
printf("\n");
}break;
case 7://判断顺序表是否为空
{
i=ListEmpty(&L);
if(i==1)
printf("是空的!\n");
else if(i==0)
printf("不是空的\n");
}break;
case 8://打印顺序表
{
i=ListTraverse(&L);
if(i==0) printf("没有顺序表!\n");
}break;
case 9://销毁顺序表
{
i=DestroyList(&L);
if(i==1)
printf("已销毁!\n");
else if(i==0)
printf("销毁失败\n");
}break;
case 10:
{ printf("要获取第几个元素:");
scanf("%d",&j);
i=GetElem(L,j,&e);
if(i==1)
printf("获取成功!\n");
else if(i==0)
printf("获取失败\n");
printf("获取的元素是%d:\n",e);
}
}
}
system("pause");
return 0;
}