线性表的顺序存储结构

#include<stdio.h>
#include<stdlib.h>

#define length 100
#define addlength 10

typedef struct
{
	int *eum;
	int legth;
	int size;
}List;

void Initlist(List &L,int n)
{
	//初始化链表
	int i;
	L.eum = (int *)malloc(length * sizeof(int));//动态开辟内存
	if(!L.eum)
		exit(0);//判断是否开辟成功
	L.size=length;
	for(i=0;i<n;i++)
		scanf("%d",&L.eum[i]);//输入链表中的数据 
	L.legth=n;
	printf("the List has created succeed!\n");
}

void display(List L)
{
	//输出链表
	int j;
	for(j=0;j<L.legth;j++)
		printf("%d ",L.eum[j]);
	putchar('\n');
}

void  Delate(List & L,int i,int &e//将实参引用进来然后记录)
{
	//删除链表中的某一个数据
	e=L.eum[i-1];//记录
	for(int j=i-1;j<L.legth;j++)
		L.eum[j]=L.eum[j+1];//所有该位置后面的元素前移
	L.legth--;//长度减一 

}

void insertlist(List & L,int i,int e)
{
	//插入元素
	int j;
	if(i<=0||i>L.legth+1)
	{
		printf("the location is wrong!");
		exit(0);
	}//判断是否插入位置正确
	if(L.legth+1>L.size)
	{
		realloc(L.eum,L.legth+addlength);
		L.size=L.legth+addlength;
	}//插入如果超出链表范围 ,动态增加内存
	for(j=L.legth;j>=i;j--)
	{
		L.eum[j] = L.eum[j-1];//所有元素后移 ,空出插入位置。

	}
		L.eum[i-1]=e;//插入
		L.legth++;//长度增加
		printf("it has already inserted\n");

}

void sortlist(List & L)
{
	//排序
 int i,j,temp;
    for(i=0;i<L.legth-1;i++)
    {
        for(j=i+1;j<L.legth;j++)
        {
            if(L.eum[i]<L.eum[j])
            {
                temp=L.eum[i];
                L.eum[i]=L.eum[j];
                L.eum[j]=temp;
            }
        }
    }
}

void findlist1(List L,int i)
{
	//查找某一位置上的元素
	printf("the i_th is%d\n",L.eum[i-1]);
}

int findlist2(List L,int e)
{
	//查找某一元素的位置
	for(int j=0;j<L.legth;j++)
		if(L.eum[j]==e)
		{
			printf("the %d is %d_th number\n",e,j+1);
			return 1;
		}
		else 
			printf("can`t find the eum!\n");

			return 0;
}

void distorylist(List &L)
{
	//销毁链表
	free(L.eum);
    L.legth=0;
    L.size=0;//范围置零
}

int main()
{
	List L;
	int n,i,e;
	int x;
	
	while(1)
    {
        printf("            1、建立一个线性表\n");
        printf("            2、插入数据\n");
        printf("            3、删除数据\n");
        printf("            4、对数据排序\n");
        printf("            5、查找数据的位置\n");
        printf("            6、查找该位置的数据\n");
		printf("            7、显示数据\n");
        printf("            8、销毁线性表\n");
        printf("            9、退出\n");
	printf("please in put the number of list\n");
	scanf("%d",&x);
	switch(x)
	{
		 case 1:
				printf("please input the number of data");
				scanf("%d",&n);
                Initlist(L,n);
                break;
            case 2:
                printf("输入插入的数据和位置:");
                scanf("%d %d",&e,&i);
                insertlist(L,i,e);
                break;
            case 3:
                printf("输入删除数据的位置:");
                scanf("%d",&i);
                Delate(L,i,e);
                printf("删除的数据为%d\n",e);
                break;
            case 4:
                sortlist(L);
                break;
			case 5:
				printf("输入要查找第几个数据");
				scanf("%d",&i);
				findlist1(L,i);
            case 6:
                printf("输入要查找的数据:");
                scanf("%d",&e);
                findlist2(L,e);
                if(i==0)
                    printf("未查找到。\n");
                break;
            case 7:
                display(L);
                break;
            case 8:

                printf("销毁数据\n");
				distorylist(L);
                break;
            case 9:
                return 0;
	}
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性表顺序存储结构的算法包括初始化操作、插入操作、删除操作、查找操作等。以下是各个操作的算法思路及代码实现: 1. 初始化操作(InitList)算法思路: - 将线性表的长度设置为0 - 返回线性表 代码实现: ```c #define MaxSize 100 // 定义线性表的最大长度 typedef struct { int data[MaxSize]; // 存储线性表元素的数组 int length; // 线性表的当前长度 } SqList; // 顺序存储结构线性表类型 SqList InitList() { SqList L; L.length = 0; return L; } ``` 2. 插入操作(ListInsert)算法思路: - 判断线性表是否已满,若已满则返回错误信息 - 判断插入位置是否合法,若不合法则返回错误信息 - 将插入位置及之后的元素依次后移一位 - 将要插入的元素放入指定位置 - 线性表长度加1 - 返回成功信息 代码实现: ```c Status ListInsert(SqList *L, int i, int e) { if (L->length == MaxSize) { // 判断线性表是否已满 return ERROR; } if (i < 1 || i > L->length + 1) { // 判断插入位置是否合法 return ERROR; } for (int j = L->length; j >= i; j--) { // 将插入位置及之后的元素依次后移一位 L->data[j] = L->data[j - 1]; } L->data[i - 1] = e; // 将要插入的元素放入指定位置 L->length++; // 线性表长度加1 return OK; // 返回成功信息 } ``` 3. 删除操作(ListDelete)算法思路: - 判断线性表是否为空,若为空则返回错误信息 - 判断删除位置是否合法,若不合法则返回错误信息 - 将删除位置及之后的元素依次前移一位 - 线性表长度减1 - 返回成功信息 代码实现: ```c Status ListDelete(SqList *L, int i, int *e) { if (L->length == 0) { // 判断线性表是否为空 return ERROR; } if (i < 1 || i > L->length) { // 判断删除位置是否合法 return ERROR; } *e = L->data[i - 1]; // 将删除的元素赋值给e for (int j = i; j < L->length; j++) { // 将删除位置及之后的元素依次前移一位 L->data[j - 1] = L->data[j]; } L->length--; // 线性表长度减1 return OK; // 返回成功信息 } ``` 4. 查找操作(GetElem)算法思路: - 判断查找位置是否合法,若不合法则返回错误信息 - 返回指定位置的元素 代码实现: ```c Status GetElem(SqList L, int i, int *e) { if (i < 1 || i > L.length) { // 判断查找位置是否合法 return ERROR; } *e = L.data[i - 1]; // 返回指定位置的元素 return OK; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值