## 数结构顺序表基本操作C语言/c++实现

数结构顺序表基本操作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;
}

上一篇:C++ 实现分块查找(链式存储结构)(完整代码)


下一篇:顺序表的插入删除算法移动元素次数分析