王道数据结构——C语言实现

线性表的顺序存储——顺序表


王道数据结构——C语言实现_第1张图片

#include 
#include  
/*疑问:既然C语言中没有引用这一说法,那么在静态分配中该怎么初始化?
(因为形参是顺序表的地址)
声明一个结构体指针p,让p存储顺序表的地址*/
/*定义顺序表 
1.初始化顺序表。InitList(&L)静态分配内存版(用结构体定义顺序表)
2.实现求表长。Length(L) 。返回线性表的长度,即L中元素的个数 
3.实现插入操作。ListInsert(&L,i,e)。在表Lde第i个位置插入指定元素e 
4.删除 。ListDelete(&L,i,&e)。删除表L中第i个位置的元素,并用e返回删除元素的值。
5.打印顺序表。PrintList(L)。将表L打印到屏幕上。*/

#define MaxSize 10
//定义顺序表。
typedef struct{
	int data[MaxSize];
	int length;
}SeqList; 


//初始化顺序表。 
void InitList(SeqList *p){
	int i;
	for(i = 0; i < MaxSize; i++){
		p->data[i] = 0;//给顺序表设置默认初始值。 
	}
p->length = 0; //顺序表初始长度为0.有效元素的个数就是长度。 
}
 
//指定元素插入指定位置
/*
1.先要把当前指定位置上的数据元素和后继元素都向后移一位 :
	for循环是j由大到小遍历元素(从数组元素的下标加1开始,也就是数组的长度)
	将数组中的元素赋值给下一个位置
2.循环结束时,顺序表中指定位置i的元素和i+1的元素的值是相等的。此时再把想要
	插入的值插入到第i个位置。
3.为了避免输入的指定位置i不合法,要对i进行判断,如果i不在数组1到Length范围内
	那么返回false,否则返回true表示插入成功。因此完全可以把插入函数写成一个布尔类型返回值的函数
	主函数如果接收到的是false,那么打印出i不合法的信息,并重新输入插入函数的参数重新插入
4.另一种情况,当顺序表已经存满的时候也要返回false 
*/ 
bool ListInsert(SeqList *p,int i,int e){
	int j;
	if(i<1||i>p->length+1)
		return false;
	if(p->length>=MaxSize)
		return false; 
	for(j=p->length;j>=i;j--){
		p->data[j]=p->data[j-1];
	}
	p->data[i-1]=e;
	p->length++;

	return true;
}

/*删除一个元素时,要把这个元素后面的所有元素都向前移一位,同时length-1
1.首先判断要删除的位置i的合法性
	1>不能小于1,不能大于length
2.将要删除的元素赋值给中间变量e(要在主函数中打印出被删除的值是多少)
	1>为了将这个元素值从删除函数中带出来,
		已经在主函数里定义了一个指针p指向这个中间变量。
		只要把这个要删除的值赋给*p就可以了
3.将删除的元素后面的所有元素向前移动一位
	1>利用for循环,从要删除的位置i(引入一个变量j=i)遍历到最后一个元素
		每一次循环都把后一个元素赋值给当前的第j个元素
4.将顺序表长度-1*/ 
bool ListDelete(SeqList *p,int i,int *q){
	int j;
	if(i<1||i>p->length)
		return false;
	*q=p->data[i-1];
	for(j=i;j<p->length;j++){
		p->data[j-1]=p->data[j];
	}	
	p->length--;
	return true;
} 

//查找元素

/*1.按位查找
1>按照想要查找的位置返回此位置下的元素值*/
int LocateElem(SeqList L,int i){
	return L.data[i-1];
} 


//打印整个顺序表
int PrintList(SeqList L){
	int i;
	
	for(i=0;i<L.length;i++){
		printf("现在是第%d个元素,元素值为:%d.\n",i+1,L.data[i]);
	}
	
} 
int main(){
	int i;
	int index = 1;
	 
	SeqList L;//  声明一个顺序表。这一步在内存中开辟一块空间给L使用。
	SeqList *p;
	p=&L;
	/*声明一个结构体指针,让这个指针指向L。
	后续需要用到顺序表的地方都用这个结构体指针代替*/ 
	 
	InitList(p);//  初始化顺序表L
	printf("The SeqList had been initiated.The length is %d.\n",L.length);
	
	/*  顺序表指定位序前插入新元素,我想要得到的数组为1到10 */ 
	for(i = 10;i > 0;i--){
		ListInsert(p,index,i);
		
	}
	printf("插入后顺序表长度为%d\n",L.length); 
	PrintList(L);
	
	// 删除第三个位置的元素值 
	int e=-1;
	int *q;
	q=&e;
	if(ListDelete(p,3,q))
		printf("已经删除第三个元素,删除元素值为:%d\n",e);
	else
		printf("位序i不合法,删除失败\n");
		
	printf("删除后顺序表长度为%d\n",L.length); 
	PrintList(L);
	
	
	//查找最后一个位置的元素值
	printf("最后一个位置的元素值为:%d.\n",LocateElem(L,L.length)); 
	return 0;
	
}

你可能感兴趣的:(c语言,数据结构,开发语言)