数据结构(C语言)——第二章、线性表(1)顺序表

一、顺序表(静态分配)

#include<stdio.h>
#include <stdlib.h>
 
//静态分配
#define Maxsize 10
typedef struct {
    int data[Maxsize];
    int length;
}SqList;
 
 
//基本操作
//1.初始化一个顺序表---静态表
void InitList(SqList &L);
//2.插入操作---在第i个位置插入元素 
bool ListInsert(SqList &L, int i, int e); 
//3.删除操作---删除第i个元素 
bool ListDelete(SqList &L, int i, int &e);
//4.按位查找
int GetElem(SqList L, int i); 
//5.按值查找
int LocateElem(SqList L, int e); 
//6.遍历输出 
void PrintList(SqList &L); 
 
//初始化一个顺序表---静态表
void InitList(SqList &L) {
    //将所有数据元素初始化为0 可以省略 
//    for(int i=0; i<L.length; i++){
//        L.data[i] = 0;
//    }
    //顺序表初始长度设为0
    L.length = 0;
}
 
//插入操作---在第i个位置插入元素 
bool ListInsert(SqList &L, int i, int e) {  //位序-数组下标=1 
	if(i<1 || i>L.length+1){         //i无效 
		return false;
	}
	if(L.length>=Maxsize){          //数组容量不足 
		return false;
	}
	
	for(int j=L.length; j>=i; j--){   //将第i个元素及之后的元素后移一位 
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;                 //在位序i(下标i-1)放e 
	L.length++;                      //长度 + 1
	return true; 
} 
 
//删除操作---删除第i个元素 
bool ListDelete(SqList &L, int i, int &e) { 
	if(i<1 || i>L.length+1){         //i无效 
		return false;
	}
	e = L.data[i-1]; 
	for(int j=i; j<L.length; j++){   //将第i个位置之后的元素前移一位 
		L.data[j-1] = L.data[j];
	}
	L.length--;                      //长度 - 1
	return true; 
}
 
//按位查找
int GetElem(SqList L, int i) {
	return L.data[i-1];
} 
 
//按值查找
int LocateElem(SqList L, int e) {
	for(int i=0; i<L.length; i++){
		if(L.data[i] == e){
			return i+1;  //返回位序 
		} 
	} 
	return 0; 
} 
 
//遍历输出 
void PrintList(SqList &L) {
    for(int i=0; i<L.length; i++){             //用L.length遍历访问 
        printf("data[%d]=%d\n", i, L.data[i]);
    }
}
 
int main() {
    //**************************声明动态顺序表 **************************
	SqList L;  
	//**************************初始化***********************************
    InitList(L);
    //**************************给数组赋一些初值*************************
    for(int i=0; i<5; i++){  
        L.data[i] = i+1;
        L.length++;
    }
	//**************************在位序3插入10****************************
    if(ListInsert(L, 3, 10)) {
    	printf("插入成功!\n"); 
	} else{
		printf("您输入的位置i无效,或当前存储空间已满,不能插入!\n");
	}
    PrintList(L);     //遍历L 
    //*************************删除位序4对应的元素************************
    int e = -1;
    if(ListDelete(L, 4, e)){
    	printf("已删除第4个元素,删除元素值为=%d\n", e); 
	}else{
		printf("您输入的位置i无效!\n");
	}
	//************************查找****************************************
	int num_Get = 0;
	printf("请输入您想查询的位序:"); 
	scanf("%d", &num_Get);
	printf("第%d个元素:%d\n", num_Get, GetElem(L, num_Get)); //按位查找
	
	printf("请输入您想查询的数字:");
	scanf("%d", &num_Get);
	int num_Locate = LocateElem(L, num_Get); //按值查找	 
	if(num_Locate != 0){
		printf("数字%d所在位序:%d\n", num_Get, num_Locate);
	}else{
		printf("未找到该数字哦!");
	}
	
    
    return 0;
    system("pause");
}

二、顺序表(动态分配)

#include<stdio.h>
#include <stdlib.h>
 
//动态分配 
#define InitSize 10  //默认最大长度 
typedef struct {
    int *data;    //指示动态分配数组的指针 
    int MaxSize;  //顺序表的最大容量 
    int length;   //顺序表当前的长度 
}SeqList;
 
 
//基本操作
//1.初始化一个顺序表---动态表
void InitList(SeqList &L);
//2.动态增加数组的长度---动态表
void IncreaseSize(SeqList &L, int len);
//3.插入操作---在第i个位置插入元素 
bool ListInsert(SeqList &L, int i, int e); 
//4.删除操作---删除第i个元素 
bool ListDelete(SeqList &L, int i, int &e);
//5.按位查找
int GetElem(SeqList L, int i); 
//6.按值查找
int LocateElem(SeqList L, int e); 
//7.遍历输出 
void PrintList(SeqList &L); 
 
 
//初始化一个顺序表---动态表
void InitList(SeqList &L) {
	//用malloc申请一片连续的存储空间 
	L.data = (int *)malloc(InitSize*sizeof(int)); 
	L.length = 0;
	L.MaxSize = InitSize; 
}
 
//动态增加数组的长度---动态表
void IncreaseSize(SeqList &L, int len) {
	int *p = L.data;
	L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));//len 要增加的长度
	for(int i=0; i<L.length; i++){
		L.data[i] = p[i];           //将数据复制到新区域 
	} 
	L.MaxSize = L.MaxSize + len;    //顺序表的长度增加len 
	free(p);                        //释放掉原来的内存空间 
} 
 
 
//插入操作---在第i个位置插入元素 
bool ListInsert(SeqList &L, int i, int e) {  //位序-数组下标=1 
	if(i<1 || i>L.length+1){         //i无效 
		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;                 //在位序i(下标i-1)放e 
	L.length++;                      //长度 + 1
	return true; 
} 
 
 
//删除操作---删除第i个元素 
bool ListDelete(SeqList &L, int i, int &e) { 
	if(i<1 || i>L.length+1){         //i无效 
		return false;
	}
	e = L.data[i-1]; 
	for(int j=i; j<L.length; j++){   //将第i个位置之后的元素前移一位 
		L.data[j-1] = L.data[j];
	}
	L.length--;                      //长度 - 1
	return true; 
}
 
//按位查找
int GetElem(SeqList L, int i) {
	return L.data[i-1];
}
 
//按值查找 
int LocateElem(SeqList L, int e) {
	for(int i=0; i<L.length; i++){
		if(L.data[i] == e){
			return i+1;  //返回位序 
		} 
	} 
	return 0; 
} 
 
 
//遍历输出 
void PrintList(SeqList &L) {
    for(int i=0; i<L.length; i++){
        printf("data[%d]=%d\n", i, L.data[i]);
    }
}
 
int main() {
	//**************************声明动态顺序表 **************************
	SeqList L;  
	//**************************初始化***********************************
    InitList(L);
    //**************************给数组赋一些初值*************************
    for(int i=0; i<5; i++){  
        L.data[i] = i+1;
        L.length++;
    }
    //**************************增加数组长度*****************************
	printf("L.MaxSize=%d\n",L.MaxSize);
	IncreaseSize(L, 5);
	printf("L.MaxSize=%d\n",L.MaxSize); 
	//**************************在位序3插入10****************************
    if(ListInsert(L, 3, 10)) {
    	printf("插入成功!\n"); 
	} else{
		printf("您输入的位置i无效,或当前存储空间已满,不能插入!\n");
	}
    PrintList(L);     //遍历L 
    //*************************删除位序4对应的元素************************
    int e = -1;
    if(ListDelete(L, 4, e)){
    	printf("已删除第4个元素,删除元素值为=%d\n", e); 
	}else{
		printf("您输入的位置i无效!\n");
	}
	//************************查找****************************************
	int num_Get = 0;
	printf("请输入您想查询的位序:"); 
	scanf("%d", &num_Get);
	printf("第%d个元素:%d\n", num_Get, GetElem(L, num_Get)); //按位查找
	
	printf("请输入您想查询的数字:");
	scanf("%d", &num_Get);
	int num_Locate = LocateElem(L, num_Get); //按值查找	 
	if(num_Locate != 0){
		printf("数字%d所在位序:%d\n", num_Get, num_Locate);
	}else{
		printf("未找到该数字哦!");
	}
	
    return 0;
    system("pause");
}

参考:
1.《王道数据结构教程》
2. 严蔚敏《数据结构》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值