一、《详解顺序表》

1、顺序表的定义

要理解何为顺序表,先要知道什么是线性表

线性表具有相同数据类型的 n (n>0)个数据元素的有限序列

线性表三大特点:

  • 存在唯一的首元素(表头元素)和尾元素(表尾元素)
  • 除第一个元素外,每个元素有且仅有一个直接前驱
  • 除最后一个个元素外,每个元素有且仅有一个直接后继

顺序表的概念:顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使的逻辑上相邻的两个元素在物理位置上也相邻。

2、顺序表的特点

  • 表中元素的逻辑顺序与物理顺序相同。
  • 随机访问,即通过首地址和元素序号可在时间O(1)内找到指定的元素。
  • 存储密度高,每个节点只存储数据元素。
  • 逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。

3、顺序表的运算

  • 插入:在顺序表的指定位置插入一个元素,将插入位置后的元素依次向后移动来实现。
  • 删除:从顺序表中删除指定位置的元素,将删除位置后的元素依次向前移动来实现。
  • 查找:在顺序表中查找指定元素的位置,使用线性搜索或二分搜索等算法来实现。
  • 更新:修改顺序表中指定位置的元素的值。
  • 求长度:计算顺序表中元素的个数。

4、顺序表的实现

4.1顺序表的初始化

/*顺序表初始化*/
int init(SeqList *L)
{
	L->length = 0;
	return 0;
}

4.2顺序表的长度

/*顺序表的长度*/
int length(SeqList *L)
{
	return L->length;
}

4.3插入元素

/*插入元素*/
int insert(SeqList *L, int i, DataType x)
{
	int j;
 
	/*判断是否满*/
	if(full(L))
	{
		printf("Error[10001],顺序表已满!\n");
		return 10001;
	}
	/*判断位置i合法性*/
	if(i<1 || i>length(L)+1)
	{
		printf("Error[10002],位置i不合法!\n");
		return 10002;
	}
 
	/*移动元素,向后移动*/
	for(j=L->length;j>=i;j--)
	{
		L->data[j] = L->data[j-1];
	}
	L->data[j] = x;
	L->length++;
	return 0; /*ok!*/
}

4.4删除元素

/*删除元素*/
int delete(SeqList *L, int i, DataType *x)
{
	int k;
	if(i<1||i>=L->length+1){	//如果删除位置不合法,则无法删除 
		printf("Error[1003],删除位置i不合法\n");
		return 10003;  /*返回10003表示位置不合法*/
	} 
	
	for(k=i-1;k<L->length-1;k++){
		L->data[k]=L->data[k+1];
		 
	} 
	L->length--;
	return 0; 
}

4.5输出顺序表

/*输出顺序表*/
void print(SeqList *L)
{
	int i;
 
	if(empty(L))
	{
		printf("顺序表为空!\n");
		return 0 ;
	}
	printf("顺序表为:");
	for(i=0;i<L->length;i++)
	{
		printf(" %d ", L->data[i]);
	}
	printf("\n");
}

4.6查找元素

/*查找元素*/
int find(SeqList *L,int x)
{
	int i;
	for (i=0;i<L->length;i++){
		if (L->data[i]==x){
			printf("元素【%d】在表中第【%d】个位置\n",x,i+1);
		}
	}
}

5.完整代码

5.1(主函数)main.c

#include <stdio.h>
#include "SeqList.h"
#include "welcome.h"
#include<string.h>
int main(int argc, char* argv[])
{
	SeqList L;
	int cmd;
	int i;
	int m,n;
 
	DataType x;
	
	for(i=0;i<strlen(welcome);i++)
	{
		printf("%c",welcome[i]);
		for(m=0;m<1000;m++)
			for(n=0;n<1000;n++)
			{
				;
			}
	}
	printf("\n\n\n");
	printf("---------------------顺序表演示程序-------------------\n");
	do
	{
		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("0. 退出\n");
		printf("请输入您要进行的操作(1~8,0退出):");
		scanf("%d", &cmd);
		switch(cmd)
		{
		case 1:
			if(!init(&L))
			{
				printf("顺序表已初始化!\n");
			}
			break;
		case 2:
			printf("请输入插入位置i,插入元素x(i,x):");
			scanf("%d,%d",&i,&x);
			if(!insert(&L,i,x))
			{
				printf("元素【%d】已插入位置【%d】\n",x, i);
			}
			break;
		case 3:
			printf("请输入删除位置i(i):");
			scanf("%d",&i);
			if(!delete(&L,i,&x)){ 
				printf("位置【%d】上的元素已经删除\n",i, x);
			}
			break;
		case 4:
			if(empty(&L))
			{
				printf("顺序表为空\n");
			}
			else
			{
				printf("顺序表不为空!\n");
			}
			break;
			 
		case 5:
			if(full(&L))
			{
				printf("顺序表已满!\n");
			}
			else
			{
				printf("顺序表未满!\n");
			}
			break;
		case 6:
			print(&L);
			break;
		case 7:
			printf("请输入你要查找的元素x:");
			scanf("%d",&x);
			find(&L,x,i);
			break;
		case 8:
			printf(" 本程序为顺序表的演示程序,有HQ设计开发,程序实现了对顺序表插入删除查找等功能!\n");
			break;
			
		}
	}while(cmd != 0);
 
	return 0;
}

5.2 SeqList.c(函数实现)

/*
	SeqList.c 顺序表实现
*/
#include "SeqList.h"
 
 
/*顺序表初始化*/
int init(SeqList *L)
{
	L->length = 0;
	return 0;
}
 
 
/*顺序表的长度*/
int length(SeqList *L)
{
	return L->length;
}
 
/*顺序表是否满*/
int full(SeqList *L)
{
	return (L->length == MAXSIZE)?1:0;
}
 
/*是否空*/
int empty(SeqList *L)
{
	return (L->length == 0)?1:0;
}
 
/*插入元素*/
int insert(SeqList *L, int i, DataType x)
{
	int j;
 
	/*判断是否满*/
	if(full(L))
	{
		printf("Error[10001],顺序表已满!\n");
		return 10001;
	}
	/*判断位置i合法性*/
	if(i<1 || i>length(L)+1)
	{
		printf("Error[10002],位置i不合法!\n");
		return 10002;
	}
 
	/*移动元素,向后移动*/
	for(j=L->length;j>=i;j--)
	{
		L->data[j] = L->data[j-1];
	}
	L->data[j] = x;
	L->length++;
	return 0; /*ok!*/
}
 
/*删除元素*/
int delete(SeqList *L, int i, DataType *x)
{
	int k;
	if(i<1||i>=L->length+1){	//如果删除位置不合法,则无法删除 
		printf("Error[1003],删除位置i不合法\n");
		return 10003;  /*返回10003表示位置不合法*/
	} 
	
	for(k=i-1;k<L->length-1;k++){
		L->data[k]=L->data[k+1];
		 
	} 
	L->length--;
	return 0; 
}
 
/*输出顺序表*/
void print(SeqList *L)
{
	int i;
 
	if(empty(L))
	{
		printf("顺序表为空!\n");
		return 0 ;
	}
	printf("顺序表为:");
	for(i=0;i<L->length;i++)
	{
		printf(" %d ", L->data[i]);
	}
	printf("\n");
}
/*查找元素*/
int find(SeqList *L,int x)
{
	int i;
	for (i=0;i<L->length;i++){
		if (L->data[i]==x){
			printf("元素【%d】在表中第【%d】个位置\n",x,i+1);
		}
	}
}

5.3SeqList.h(函数声明)

/*
	SeqList.h 顺序表定义
*/
 
#define MAXSIZE 1000
 
typedef int DataType;
 
/*顺序表*/
typedef struct
{
	DataType data[MAXSIZE];
	int length;
}SeqList;
 
/*顺序表初始化*/
int init(SeqList *L);
 
/*顺序表的长度*/
int length(SeqList *L);
 
/*顺序表是否满*/
int full(SeqList *L);
 
/*是否空*/
int empty(SeqList *L);
 
/*插入元素*/
int insert(SeqList *L, int i, DataType x);
 
/*删除元素*/
int delete(SeqList *L, int i, DataType x);
 
/*输出顺序表*/
void print(SeqList *L);
/*查找元素*/
int find(SeqList *L, int i, DataType x);

5.4welcome.h

char welcome[]=(
    "         lovelove                   lovelove\n"
    "       lovelovelove               lovelovelove\n"
    "     lovelovelovelove           lovelovelovelove\n"
    "   lovelovelovelovelove       lovelovelovelovelove\n"
    "  lovelovelovelovelovelo     lovelovelovelovelovelo\n"
    " loveloveloveloveloveloveFFlovelovelovelovelovelov\n"
	"  loveloveloveloveloveloFFFFFlovelovelovelovelovelo\n"
	"   loveloveloveloveloveFFFFFFlovelovelovelovelove\n"
	"     lovelovelovelovecscscsdcJJJlovelovelovelove\n"
	"       lovelovelovelovelovelovelovlovelovelove\n"
	"	lovelovelovelbfbhngovelovellovecdvd\n"
	"          lovelovelovelovelovelovecsdcdsds\n"
	"            lovelovelovelovelovelscsdcs\n"
	"              lovelovelovelovelovelov\n"
	"                lovelovelovelovelo\n"
	"                  lovelovelovelo\n"
	"                   lovelovelo\n"
	"                    lovelov\n"
	"                      love\n"
	"                       爱\n"

    );

6.运行结果截图

7.小结

顺序表是一种线性数据结构,其特点在于元素之间的逻辑关系是线性的,且元素在物理存储上是连续的。顺序表通常使用数组来实现,这使得顺序表在访问元素时具有很高的效率。然而,这种数据结构也有一些局限性,比如在插入和删除元素时可能需要移动大量的元素。

顺序表是一种线性数据结构,其特点在于元素之间的逻辑关系是线性的,且元素在物理存储上是连续的。顺序表通常使用数组来实现,这使得顺序表在访问元素时具有很高的效率。然而,这种数据结构也有一些局限性,比如在插入和删除元素时可能需要移动大量的元素。

8.参考文献

  1. 数据结构c语言版本(李刚)
  2. 百度查询
  3. csdn博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值