顺序表

线性表中的元素依次存放在一个连续的存储空间中
在这里插入图片描述
线性表结点之间具有线性、先后、一维关系

顺序表存储结构的设计

在这里插入图片描述
定义:在这里插入图片描述
总之:
顺序表逻辑上相邻对应物理地址相邻,通过数组存储数值就可以了。我们需要定义一个整型变量表示存储到那个位置了即可。

备用空间是因为我们不知道要存储的数值个数,定义一个尽可能大的数。

结构体定义:

typedef  int  ElemType;  
     //假定线性表元素的类型为整型
# define  LIST_SIZE  1024   
      //假定线性表的最大长度为1024
typedef  struct 
{ ElemType  data[LIST_SIZE];
  int last;  //指向最后结点的位置
} SequenList;
SequenList *LPtr;

Ptr百度时,记得是汇编语言的词汇,结点的意思。

===================================================================================================

在这里插入图片描述
其中最后一步操作遍历我没去实现,感觉不是很重要。
下面分别是插入、删除、查找操作。

插入:

在这里插入图片描述在这里插入图片描述
问题描述:在顺序表第i个位置插入新元素x
在这里插入图片描述
你可以用下表测试测试

算法:

int Insert_SqList(SeqList *LPtr,  ElemType x,  int k)
{  int j;
   if (LPtr->last>=LIST_SIZE-1)   return FALSE;		//溢出  
   else  if ( k<0 || k > (LPtr->last+1))  return FALSE;  	//非法位置  
          else
          {
             for(j=LPtr->last; j>=k; j--) 		//从顺序表的最后一个元素起  
             {                 
                  LPtr->data[j+1]=LPtr->data[j];
                  //向后移动(last-k)个元素
             }
             LPtr-> data[k]=x;       		//将x放入表的k位置   
             LPtr-> last= LPtr-> last+1;     	//修改最后结点指针last  
           }
     return TRUE;
} 

删除操作:

在这里插入图片描述
问题描述:将顺序表第i个结点删掉(删除结点的位置为k)在这里插入图片描述

算法:

int Delete_SqList(SeqList  *LPtr,  int k)
 {   
	if (( k >= 0 && k<= LPtr->last) &&( LPtr->last!=0))
      {	 
          for ( int j = k;   j <= LPtr->last;   j++ ) 
          {
   			LPtr->data[j] = LPtr-> data[j+1];
          }
           	LPtr->last --;
            	return TRUE;  		//成功删除	
      }	
 	return FALSE;   			//异常情形
 } 
  

测试样例:
在这里插入图片描述

查找操作:

定义:
在这里插入图片描述
设计一个从数组下标从0到last之前的比较

函数结构设计:
在这里插入图片描述
算法:

int Locate_SqList(SeqList *LPtr, ElemType key)
{     
    for(int i=0; i< LPtr->last; i++)  
       if(LPtr->data[i]== key)  return i;      
    return -1;                      
}

测试样例:
在这里插入图片描述
顺序表操作代码

#include<Stdio.h>
#include<malloc.h>
typedef int ElemType;
#define LIST_SIZE 1024
#define FALSE 0
#define TRUE 1
typedef struct {
	ElemType data[LIST_SIZE];
	int last;
} SeqList;
SeqList *LPtr;

/*=========================================
函数功能:顺序表运算——建立顺序表
函数输入:顺序表地址
函数输出:空
===========================================*/
void creat_list(SeqList *LPtr) {
	int i;
	printf("请输入线性表的长度:");
	scanf("%d",&LPtr->last);
	for(i=0; i<LPtr->last; i++) {
		printf("数据%d=",i);
		scanf("%d",&(LPtr->data[i]));
	}
}/*输出线性表*/


///*=========================================
//发现这一段不怎么需要
//函数功能:顺序表运算——初始化
//函数输入:顺序表地址
//函数输出:空
//===========================================*/
//void InitList(SeqList *LPtr) {
//	LPtr=(SeqList *)malloc(sizeof(SeqList));
//	LPtr->last=0;
//}

/*=========================================
函数功能:顺序表运算——清空顺序表
函数输入:顺序表地址
函数输出:空
===========================================*/
int Listqingkong(SeqList *L) {
	L->last=0;
}

/*=========================================
函数功能:顺序表运算——销毁顺序表
函数输入:顺序表地址
函数输出:空
===========================================*/
void DestroyList(SeqList *LPtr) {
	free(LPtr);
}

/*=========================================
函数功能:顺序表运算——空表判断
函数输入:顺序表地址
函数输出:判断标志——0:空    1:非空
===========================================*/
bool ListEmpty(SeqList *LPtr) {
	return(LPtr->last);
}

/*=========================================
函数功能:顺序表运算——求线性表长度
函数输入:顺序表地址
函数输出:线性表长度
===========================================*/
int ListLength(SeqList *LPtr) {
	return(LPtr->last);
}

/*=========================================
函数功能:顺序表运算——输出线性表
函数输入:顺序表地址
函数输出:输出线性表结点
===========================================*/
void DispList(SeqList *LPtr) {
	for(int i=0; i<LPtr->last; i++)
		printf("%d  ", LPtr->data[i]);
	printf("\n");

}

/*=========================================
函数功能:顺序表运算——元素的插入
函数输入:顺序表地址,插入值,插入位置
函数输出:完乘标志——0:异常    1:正常
===========================================*/
int Insert_SqList(SeqList *LPtr, ElemType x, int k) {
	int j;
	if(LPtr->last>=LIST_SIZE-1)    return FALSE;      //溢出
	else if (k<0||k>(LPtr->last+1))    return FALSE;  //非法位置
	else {
		for(j=LPtr->last; j>=k; j--) {         //from last move data
			LPtr->data[j+1]=LPtr->data[j];
			//move (last-k+1) data
		}
		LPtr->data[k]=x;                       //将x放入表的k位置
		LPtr->last=LPtr->last+1;               //修改最后结点指针 last
	}
	return TRUE;
}

/*=========================================
函数功能:顺序表运算——元素的删除
函数输入:顺序表地址,删除位置
函数输出:完成标志——0:异常    1:正常
===========================================*/
int Delete_SqList(SeqList *LPtr, int k) {
	if((k>=0&&k<=LPtr->last)&&(LPtr->last!=0)) {
		for(int j=k; j<=LPtr->last; j++) {
			LPtr->data[j]=LPtr->data[j+1];
		}
		LPtr->last--;
		return TRUE;                   //成功删除
	}
	return FALSE;                      //异常情形
}

/*=========================================
函数功能:顺序表运算——取给定下标的元素值
函数输入:顺序表地址,下标位置
函数输出:完成标志——0:异常    1:正常
===========================================*/
int Get_SqList(SeqList *LPtr,int i,ElemType &e) {
	if(i<0||i>LPtr->last) return FALSE;
	if(LPtr->last<=0)    return FALSE;
	e=LPtr->data[i];
	return TRUE;
}

/*=========================================
函数功能:顺序表运算——查找值为e的元素序号
函数输入:顺序表地址,查找元素
函数输出:元素序号
===========================================*/
int Locate_Elem(SeqList *LPtr,ElemType e) {
	int i=0;
	while(i<LPtr->last&&LPtr->data[i]!=e)
		i++;
	if(i>=LPtr->last)
		return FALSE;
	else
		return i+1;
}

测试代码

#include"SequenList.cpp"       //包含顺序表基本运算算法

SeqList a;

/*函数声明*/
void creat_list(SeqList *L);//建立
void DispList(SeqList L);//输出
int Insert_SqList(SeqList *L,int i,ElemType e);//插入
ElemType Delete_SqList(SeqList *L,int i);//删除
int Locate_Elem(SeqList L,ElemType e);//定位
int ListLength(SeqList L);//表长
void DestroyList(SeqList *L);
//清空
/*主函数*/
main() {
	int i,k,loc;
	ElemType e,x;
	char ch;
	do {
		printf("\n\n\n");
		printf("\n   1.建立线性表");
		printf("\n   2.插入元素");
		printf("\n   3.删除元素");
		printf("\n   4.查找元素");
		printf("\n   5.计算表长");
		printf("\n   6.清空");
		printf("\n   7.销毁线性表");
		printf("\n   0.结束程序运行");
		printf("\n=======================");
		printf("\n   请输入您的选择(1,2,3,4,5,6,0)");
		scanf("%d",&k);
		switch(k) {
			case 1: {
				creat_list(&a);
				DispList(&a);
			}
			break;
			case 2: {
				printf("\n 请输入插入位置(大于或等于1,小于或等于%d):",a.last+1);
				scanf("%d",&i);
				printf("\n 请输入要插入的元素值:");
				scanf("%d",&e);
				Insert_SqList(&a,i,e);
				DispList(&a);
			}
			break;
			case 3: {
				printf("\n 请输入删除位置(大于或等于1,小于或等于%d):",a.last);
				scanf("%d",&i);
				x=Delete_SqList(&a,i);

				if(x!=0) {
					printf("\n 删除成功! \n");
					printf(" 删除后的表: \n");
					DispList(&a);
				}
				else printf("要删除的元素不存在!");
			}
			break;
			case 4: {
				printf("\n 请输入要查找的元素值:");
				scanf("%d",&e);
				loc=Locate_Elem(&a,e);
				if(loc==-1) printf("\n 未找到指定元素!");
				else printf("\n 已经找到,元素位置是%d",loc);
			}
			break;
			case 5: {
				ListLength(&a);
			}
			break;
			case 6: {
				Listqingkong(&a);
			}
			break;
			case 7: {
				DestroyList(&a);
			}
			break;
		}/*switch*/
	} while(k!=0);
	printf("\n 按enter键 返回");
	ch=getchar();
}

最后,在跟着书本写代码时,还遇到很多问题,比如,error有一个[ala],当时通过百度了解到是显然,很明显的意思,当然只是觉得很有趣,另外还遇到关于ElemType不能转换int型的错误,真是,好不容易拾起来的差点又选择了放弃,还有就是测试代码的问题,一开始在书上找到一个很不整洁的代码,意思是结构感没有,单纯是人家用来测试的,当然,我认为自己还不够,所以在网上找到一个结构感清晰的代码。
写完之后,愈发感觉仅仅c还不够,希望能快点完成数据结构与算法的总结与练习,毕竟时间太紧了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值