【考研数据结构之】——1.顺序表

目录

1.定义结构体

2. 初始化顺序表

3.建立顺序表

4.打印顺序表 

5.插入元素x

6.删除元素i

7.查找元素x的位置下标

源代码:

执行结果 :


1.定义结构体

typedef struct //定义结构体
{
	int data[MAXSIZE];//顺序表中元素
	int len;//表长
}Seqlist;

        因为顺序表是利用数组来存储的,所以对于定义顺序表的结构体,一共是两个内容:一个是定义一个数组data[MAXSIZE],数组大小为MAXSIZE,另一个是int类型的len,用来表示顺序表的长度。

2. 初始化顺序表

Seqlist* Init_Seqlist()//顺序表初始化
{
	Seqlist* L;
	L = (Seqlist*)malloc(sizeof(Seqlist));
	L->len=0;
	return L;
}

        对顺序表进行初始化也是两个部分,首先对L申请动态空间,其次将L->len赋值为0。函数返回值是数组指针。

3.建立顺序表

void CreatList(Seqlist* L)//建立顺序表
{
	printf("请输入顺序表长度:");
	scanf_s("%d", &L->len);
	printf("按顺序输入表元素");
	for (int i = 1; i <= L->len; i++)
	{
		scanf_s("%d", &L->data[i]);
	}
}

        对于建立顺序表,我们首先确定要输入元素的个数,也就是L->len的长度,然后以L->len的长度做for循环,对L->data[i]进行赋值操作。

4.打印顺序表 

void print(Seqlist* L)//打印顺序表
{
	for (int i = 1; i <= L->len; i++)
	{
		printf("%d ", L->data[i]);
	}
	printf("\n");
}

        对于打印操作与建立顺序表相同, 以L->len的长度做for循环,对L->data[i]进行输出操作。

5.插入元素x

void Insert_Seqlist(Seqlist* L, int i, int x)//向表L中的第i个位置插入x
{
	int j;
	if (L->len == MAXSIZE)
	{
		printf("表满");
	}
	else 
	{
		if (i<1 || i>L->len + 1)
		{
			printf("插入位置非法");
		}
		else
		{
			for (j = L->len; j >= i; j--)
			{
				L->data[j + 1] = L->data[j];
			}
			L->data[i] = x;
			L->len++;
		}
	}
}

        对于顺序表的插入操作,我们需要对函数传入三个值,分别为:待插入数组L, 插入位置i,插入内容x。对于函数内的内容,首先我们判断顺序表是否表满。如果不为满,则再进行插入位置是否合理的判断。因为表的存储容量是从1~L->len,所以再这范围之外的插入位置都为非法。如果插入位置合法,则进行下面的插入操作。将待插入位置以后包括待插入位置本身的元素往后移一位,为将要插入的元素空出位置,然后将元素插入待插入位置即可。

注:

        1.在执行插入操作时,我们应该注意,应先将表尾的元素往后移,因为如果先移前面的元素的话,则会将后面的元素覆盖导致操作失败。

        2.在插入结束之后不要忘记对表长执行L->len++操作。

6.删除元素i

void Delete_Seqlist(Seqlist* L, int i)//删除元素i
{
	int j;
	if (L->len == 0)
	{
		printf("表空");
	}
	else
	{
		if (i<1 || i>L->len)
		{
			printf("删除位置非法");
		}
		else
		{
			for (j = i+1; j <= L->len; j++)
			{
				L->data[j-1] = L->data[j];
			}
			L->len--;
		}
	}
}

        对于顺序表的删除操作,我们需要对函数传入两个值,分别为:待执行删除操作的数组L, 删除位置i。 对于函数内的内容,首先我们判断顺序表是否为空。如果不为空,则再进行删除位置是否合理的判断。因为表的存储容量是从1~L->len,所以再这范围之外的删除位置都为非法。如果删除位置合法,则进行下面的插入操作。将data[j]的值赋给data[j-1]即可。

注:

        1.在执行删除操作时,我们应该注意,操作顺序与插入相反,实从待删除端开始往后执行。

        2.在插入结束之后不要忘记对表长执行L->len--操作。

7.查找元素x的位置下标

int Location_Seqlist(Seqlist* L, int x)//查找元素x的位置下标
{
	int i=0;
	while (i < L->len && L->data[i] != x)
	{
		i++;
	}
	if (L->data[i] == x)
	{
		return i;
	}
	else
	{
		return 0;
	}
}

         对于查找元素x的位置下标操作,只需对数组data[i]进行遍历,如果找到x则返回其下标即可。


源代码:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20

typedef struct //定义结构体
{
	int data[MAXSIZE];//顺序表中元素
	int len;//表长
}Seqlist;

Seqlist* Init_Seqlist()//顺序表初始化
{
	Seqlist* L;
	L = (Seqlist*)malloc(sizeof(Seqlist));
	L->len=0;
	return L;
}

void CreatList(Seqlist* L)//建立顺序表
{
	printf("请输入顺序表长度:");
	scanf_s("%d", &L->len);
	printf("按顺序输入表元素");
	for (int i = 1; i <= L->len; i++)
	{
		scanf_s("%d", &L->data[i]);
	}
}

void print(Seqlist* L)//打印顺序表
{
	for (int i = 1; i <= L->len; i++)
	{
		printf("%d ", L->data[i]);
	}
	printf("\n");
}

void Insert_Seqlist(Seqlist* L, int i, int x)//向表L中的第i个位置插入x
{
	int j;
	if (L->len == MAXSIZE)
	{
		printf("表满");
	}
	else 
	{
		if (i<1 || i>L->len + 1)
		{
			printf("插入位置非法");
		}
		else
		{
			for (j = L->len; j >= i; j--)
			{
				L->data[j + 1] = L->data[j];
			}
			L->data[i] = x;
			L->len++;
		}
	}
}

void Delete_Seqlist(Seqlist* L, int i)//删除元素i
{
	int j;
	if (L->len == 0)
	{
		printf("表空");
	}
	else
	{
		if (i<1 || i>L->len)
		{
			printf("删除位置非法");
		}
		else
		{
			for (j = i+1; j <= L->len; j++)
			{
				L->data[j-1] = L->data[j];
			}
			L->len--;
		}
	}
}

int Location_Seqlist(Seqlist* L, int x)//查找元素x的位置下标
{
	int i=0;
	while (i < L->len && L->data[i] != x)
	{
		i++;
	}
	if (L->data[i] == x)
	{
		return i;
	}
	else
	{
		return 0;
	}
}

int main()
{
	Seqlist* s;
	int i, x;
	s = Init_Seqlist();
	CreatList(s);
	print(s);
	printf("请输入要插入的位置和数值");
	scanf_s("%d %d", &i, &x);
	Insert_Seqlist(s, i, x);
	print(s);
	printf("请输入要删除的位置");
	scanf_s("%d", &i);
	Delete_Seqlist(s, i);
	print(s);
	printf("请输入要查找的元素");
	scanf_s("%d", &x);
	i = Location_Seqlist(s, x);
	if (i == 0)
	{
		printf("表中无该元素");
	}
	else
	{
		printf("该元素的位置下标为:%d", i);
	}
	return 0;
}

 执行结果 :

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值