数据结构笔记之—— 顺序表实现

学习数据结构了,写下来,加深记忆。

第一篇:

//system("cls");  控制台屏幕刷新
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAXSIZE 100
typedef int DataType;

typedef struct
{
	DataType data[MAXSIZE];
	int length;
}SeqList;
//初始化顺序表
SeqList SeqListInit( )
{
	SeqList L;
	//cout<<"线性表以创建"<<endl;
	L.length = 0;
	return L;
}
// 销毁顺序表
SeqList ListClear(SeqList L)
{
	L.length=0;
	//cout<<"线性表已销毁"<<endl;
	return L;
}
//判断顺序表是否为空表
int ListEmpty(SeqList L)
{
	return (L.length==0);
}
//判断顺序表是否为满
int ListFull(SeqList L)
{
	return (L.length==MAXSIZE);
}

//求顺序表长度
int ListLength(SeqList L)
{
	return L.length;
}


//从顺序表中查找元素
DataType ListGet(SeqList L ,int i)
{
	if(i<0||i>L.length-1)
		return -1;//  超出表范围,错误,返回-1
	return L.data[i-1];//顺序表元素下标从0开始
}

//从顺序表中查找与给定元素值相同的元素在顺序表中的位置
int ListLocate(SeqList L, DataType x)
{
	int i,mun = -1;
	for(i = 0;i<L.length;i++)
	{
		if(L.data[i]==x)
		{
			mun = i;
		}
	}
	if(mun==-1)
    {
        printf("当前顺序表没有元素 %d \n",x);
        return -1;
    }
    else
        return mun+1;
}
// 向顺序表中插入元素
SeqList  ListInsert1(SeqList L,DataType x)
{
    if(L.length==MAXSIZE)
        printf("表满,错误\n");//  表满,返回错误
    L.length++;
    L.data[L.length-1] = x;
    return L;

}
SeqList  ListInsert(SeqList L,int i,DataType x)
{
    int j;
	if(L.length>MAXSIZE)
		printf("表满,错误\n");//  表满,返回错误

	for(j = L.length-1;j>=i;j--)
	{
		L.data[j] = L.data[j-1];
	}
	L.length++;
	L.data[i-1] = x;
	return L;
}

/* 从顺序表中删除元素 */
SeqList ListDelete(SeqList L,int i) //i 认为是逻辑结构的位置,即从1开始
{
	int j;
	if(i<1||i>L.length)
    {
		printf("错误\n");//  表空,返回错误
        return;
    }
	for(j = i;j<L.length;j++)
		L.data[j-1] = L.data[j];
	L.length--;
	return L;
}

/*求顺序表中元素的前驱*/
void ListPrior (SeqList L,DataType e)
{
	DataType i,k = -1;
	if(L.data[0] == e)
    {
        printf("顺序表第一个元素没有前驱\n");
        return ;//  顺序表第一个元素没有前驱
    }
	for(i = 1;i<L.length;i++)
		if(e == L.data[i])
			k = i-1;
	if(k==-1)
    {
        printf("顺序表中没有元素 %d \n",e);
        return ;
    }
    else
         printf("元素 %d  的前驱为 %d \n",e,L.data[k]);

}
/*求顺序表中元素的后继*/
void ListNext(SeqList L,DataType e)
{
	DataType i,k = -1;
	if(L.data[L.length-1] == e)
    {
        printf("顺序表最后一个元素没有后继 \n");//  顺序表最后一个元素没有后继
        return ;
    }
	for(i = 0;i<L.length-1;i++)
		if(e == L.data[i])
			k = i+1;
	if(k==-1)
    {
        printf("顺序表中没有元素 %d \n",e);
        return ;
    }
    else
        printf("元素 %d  的后继为 %d \n",e,L.data[k]);
}

//输出顺序表(遍历顺序表 )
void Prinlist(SeqList L)
{
	int i;
	for(i = 0;i<L.length;i++)
		printf("%d ",L.data[i]);
	printf("\n");
}
void mainScreen()
{
    printf("请输入序号以使用以下功能 \n");
    printf("0. 退出程序\n");
    printf("1. 建立顺序表\n");
    printf("2. 插入元素,输入元素 x \n");
    printf("3. 插入元素,输入元素 x , 插入位置 i \n");
    printf("4. 删除位置为 i 的元素\n");
    printf("5. 判断顺序表是否为空 \n");
    printf("6. 判断顺序表是否为满 \n");
    printf("7. 查询顺序表长度 \n");
    printf("8. 遍历顺序表 \n");
    printf("9.  查询元素 x 位置 ,输入 x\n");
    printf("10. 查询位置为 i 元素,输入 i \n");
    printf("11.  查询元素 x 的前驱,输入 x \n");
    printf("12. 查询元素 x 的后继,输入 x \n");
    printf("13. 销毁顺序表\n");
    printf("__________________________________________\n");

}
int main()
{

	int n,x,i,tem;
	mainScreen();
	SeqList L;
	while(scanf("%d",&n)&&n!=0)
    {
        switch(n)
        {
            case 1: system("cls");
                    L = SeqListInit();
                    printf("顺序表已经建立!!\n");
                    //printf("输入 任意数字 返回主菜单\n");
                    //scanf("%d",&temp);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 2: system("cls");
                    printf("插入元素,请输入元素 x ");
                    scanf("%d",&x);
                    L = ListInsert1(L,x);
                    printf("元素 %d 已插入 \n",x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 3: system("cls");
                    printf("插入元素,请输入元素 x 及序号 i ");
                    scanf("%d%d",&x,&i);
                    L = ListInsert(L,x,i);
                    printf("元素 %d 已插入 \n",x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 4: system("cls");
                    printf("删除位置为 i 的元素,请输入 i ");
                    scanf("%d",&i);
                    int tem = L.length;
                    L = ListDelete(L,i);
                    if(tem==L.length)
                    {
                        getchar();
                        getchar();
                        system("cls");
                        mainScreen();
                        continue;

                    }
                    else
                    {
                        printf("%d 位置已删除 \n",i);
                        getchar();
                        getchar();
                        system("cls");
                        mainScreen();
                        break;
                    }
            case 5: system("cls");// empty
                    if(ListEmpty(L))
                        printf("顺序表为空!!\n");
                    else
                        printf("顺序表不为空!!\n");
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 6: system("cls");//  full
                    if(ListFull(L))
                        printf("顺序表为满!!\n");
                    else
                        printf("顺序表不为满!!\n");
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 7: system("cls");
                    x = ListLength(L);
                    printf("顺序表长度为 %d \n",x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 8: system("cls");
                    printf("遍历顺序表\n");
                    Prinlist(L);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 9 :system("cls");
                    printf("查询元素 x 位置 ,输入 x");
                    scanf("%d",&x);
                    i = ListLocate(L,x);
                    printf("元素 %d 位置为 %d \n",x,i );
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 10:system("cls");
                    printf("查询位置为 i 元素,输入 i ");
                    scanf("%d",&i);
                    x = ListGet(L,i);
                    printf("位于位置 %d 的元素为为 %d \n",i,x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 11: system("cls");
                    printf("查询元素 x 的前驱, 请输入 x ");
                    scanf("%d",&x);
                    ListPrior(L,x);
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 12:system("cls");
                    printf("查询元素 x 的后继, 请输入 x ");
                    scanf("%d",&x);
                    ListNext(L,x);
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 13:system("cls");
                    printf("销毁顺序表 ");
                    L = ListClear(L);
                    printf("顺序表已销毁 ");
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            default:printf("error");break;
        }
    }
	return 0;
}


你可能感兴趣的:(数据结构)