网站建设资讯

NEWS

网站建设资讯

C语言线性表实现:顺序表-创新互联

文章目录:
  • 概念理解:
  • 1. 动态顺序表结构体:
  • 2. 顺序表动态初始化:
  • 3. 顺序表扩容:
  • 4. 插入:
  • 5. 删除:
  • 6. 按位序查找:
  • 7. 按值查找:
  • 8. 输出顺序表:
  • 9. 判断顺序表是否相等:
  • 10.测试:

目前累计服务客户成百上千家,积累了丰富的产品开发及服务经验。以网站设计水平和技术实力,树立企业形象,为客户提供成都网站设计、网站建设、网站策划、网页设计、网络营销、VI设计、网站改版、漏洞修补等服务。成都创新互联始终以务实、诚信为根本,不断创新和提高建站品质,通过对领先技术的掌握、对创意设计的研究、对客户形象的视觉传递、对应用系统的结合,为客户提供更好的一站式互联网解决方案,携手广大客户,共同发展进步。概念理解:

线性表:一种逻辑结构。
顺序表:采用顺序存储方式实现的线性表。

位序:从1开始。
数组下标:从0开始。

&引用符的使用:
函数参数带&和不带&的区别。

malloc:申请一整片连续的存储空间,返回一个指向该空间首地址的指针。
free:释放一整片连续的存储空间。

1. 动态顺序表结构体:
//顺序表的动态分配
#define InitSize 10 //初始大小
typedef struct{int* data;//指针,指向动态分配的内存空间的首地址
	int length;//该顺序表的长度
	int MaxSize;//该顺序表的大长度
}SeqList;
2. 顺序表动态初始化:
void InitList(SeqList &L){//初始化顺序表,包括给顺序表L动态分配内存空间,设置顺序表当前长度为0,设置顺序表大长度100
	L.data = (int*)malloc(sizeof(int) * InitSize);
	L.length = 0;
	L.MaxSize = 100;	
}
3. 顺序表扩容:
void IncreaseSize(SeqList &L,int len){//顺序表扩容
	int* p = L.data;//创建一个指针指向顺序表当前内存空间的首地址,方便回收
	L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新请求一块更大的内存空间分配给该顺序表
	L.MaxSize += len;//修改顺序表大长度
	for(int i=0;i<=L.length;i++){L.data[i] = p[i];//将原内存空间中的数据复制到新申请的空间中
	}
	free(p);//释放原来的内存空间
}
4. 插入:
bool ListInsert(SeqList &L,int i,int e){//插入元素e到顺序表位序为i的位置
	if(i<1 || i>L.length+1){//判断插入位置是否合法
		return false;
	}
	if(L.length == L.MaxSize){//判断顺序表是否已满
		return false;
	}
	for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(这里注意区分位序和数组下标的关系)
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;//插入数据
	L.length++;//注意别忘了顺序表长度+1
	return true;
}
5. 删除:
bool ListDelete(SeqList &L,int i,int &e){//删除顺序表为序为i的数据元素,并将该元素的值赋给e
	if(i<1 || i>L.length){return false;
	}
	e = L.data[i-1];//将被删除的元素的值赋值给e
	for(int j=i;j//位序i之后的元素前移
		L.data[j-1] = L.data[j];
	}
	L.length--;//注意别忘了顺序表长度-1
	return true;
}
6. 按位序查找:
int getElem(SeqList L,int i){//按位序查找,返回该位序上的元素
	if(i<1 || i>L.length){//判断位置是否合法
		return -1;
	}
	return L.data[i-1];
}	
7. 按值查找:
int LocateElem(SeqList L,int e){//按值查找,返回该值的位序
	for(int j=0;jif(L.data[j] == e){	return j+1;//返回的是位序
		}
	}
	return -1;
}
8. 输出顺序表:
void printList(SeqList L){//输出顺序表的元素
	printf("[");
	for(int i=0;iprintf("%d ",L.data[i]);
	}
	printf("]\n");
}
9. 判断顺序表是否相等:
bool equalsList(SeqList L1,SeqList L2){//判断顺序表内容是否相同
	if(L1.MaxSize == L2.MaxSize){if(L1.length == L2.length){	for(int i=0;i		if(L1.data[i] == L2.data[i]){continue;
				}
			}
		}
		return true;
	}
	return false;
}
10.测试:
#include#include//使用malloc和free关键字需要引入这个库

//顺序表的动态分配
#define InitSize 10 //初始大小
typedef struct{int* data;//指针,指向动态分配的内存空间的首地址
	int length;//该顺序表的长度
	int MaxSize;//该顺序表的大长度
}SeqList;

void InitList(SeqList &L){//初始化顺序表,包括给顺序表L动态分配内存空间,设置顺序表当前长度为0,设置顺序表大长度100
	L.data = (int*)malloc(sizeof(int) * InitSize);
	L.length = 0;
	L.MaxSize = 100;	
}

void IncreaseSize(SeqList &L,int len){//顺序表扩容
	int* p = L.data;//创建一个指针指向顺序表当前内存空间的首地址,方便回收
	L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新请求一块更大的内存空间分配给该顺序表
	L.MaxSize += len;//修改顺序表大长度
	for(int i=0;i<=L.length;i++){L.data[i] = p[i];//将原内存空间中的数据复制到新申请的空间中
	}
	free(p);//释放原来的内存空间
}

bool ListInsert(SeqList &L,int i,int e){//插入元素e到顺序表位序为i的位置
	if(i<1 || i>L.length+1){//判断插入位置是否合法
		return false;
	}
	if(L.length == L.MaxSize){//判断顺序表是否已满
		return false;
	}
	for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(这里注意区分位序和数组下标的关系)
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;//插入数据
	L.length++;//注意别忘了顺序表长度+1
	return true;
}

bool ListDelete(SeqList &L,int i,int &e){//删除顺序表为序为i的数据元素,并将该元素的值赋给e
	if(i<1 || i>L.length){return false;
	}
	e = L.data[i-1];//将被删除的元素的值赋值给e
	for(int j=i;j//位序i之后的元素前移
		L.data[j-1] = L.data[j];
	}
	L.length--;//注意别忘了顺序表长度-1
	return true;
}

int getElem(SeqList L,int i){//按位序查找,返回该位序上的元素
	if(i<1 || i>L.length){//判断位置是否合法
		return -1;
	}
	return L.data[i-1];
}	
 
int LocateElem(SeqList L,int e){//按值查找,返回该值的位序
	for(int j=0;jif(L.data[j] == e){	return j+1;//返回的是位序
		}
	}
	return -1;
}

void printList(SeqList L){//输出顺序表的元素
	printf("[");
	for(int i=0;iprintf("%d ",L.data[i]);
	}
	printf("]\n");
}

bool equalsList(SeqList L1,SeqList L2){//判断顺序表内容是否相同
	if(L1.MaxSize == L2.MaxSize){if(L1.length == L2.length){	for(int i=0;i		if(L1.data[i] == L2.data[i]){continue;
				}
			}
		}
		return true;
	}
	return false;
}

int main(){SeqList L1;//声明一个顺序表
	InitList(L1);//初始化顺序表
	
	//初始化、扩容测试
	printf("顺序表当前内存空间的首地址:%d\n",&L1.data[0]);
	printf("顺序表当前大长度:%d\n",L1.MaxSize);
	IncreaseSize(L1,5);//扩容顺序表,扩容长度为5
	printf("顺序表当前内存空间的首地址:%d\n",L1.data);
	printf("顺序表当前大长度:%d\n",L1.MaxSize);
	
	//插入、输出测试
	ListInsert(L1,1,5);
	printList(L1);
	
	//按位查找、按值查找测试
	printf("顺序表中位序为1的元素为:%d\n",getElem(L1,1));
	printf("顺序表中元素5的位序为:%d\n",LocateElem(L1,5));
	
	//删除测试
	int a;
	ListDelete(L1,1,a);
	printf("删除的元素为:%d\n",a);
	printList(L1);
	
	//判断顺序表数据相等测试
	SeqList L2;//声明一个顺序表
	InitList(L2);//初始化顺序表	
	ListInsert(L1,1,3);
	ListInsert(L2,1,8);
	printf("顺序表L1和L2是否相等:%d\n",equalsList(L1,L2));
	ListDelete(L1,1,a);
	ListInsert(L1,1,8);
	IncreaseSize(L2,5);
	printf("顺序表L1和L2是否相等:%d\n",equalsList(L1,L2));
	
	return 0;
}

在这里插入图片描述

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:C语言线性表实现:顺序表-创新互联
URL链接:http://cdweb.net/article/djiedp.html