考研数据结构——(线性表_顺序表)

线性表编程记录

  • 线性表的顺序表示(顺序表)
    • 定义如下
    • 主函数 main
    • 1.1 初始化顺序表
    • 1.2 打印顺序表
    • 1.3去除顺序表的重复元素
    • 1.4 在第i个位置插入元素
    • 1.5 删除指定位置的元素
    • 1.6 查找指定元素的位序

线性表的顺序表示(顺序表)

定义如下

#include 
#define MaxSize 10 //定义数组最大长度
#define flase 0  // 失败返回
#define true 1   // 成功返回
typedef struct{  // 顺序表的结构体
	int data[MaxSize];  // 静态分配地址
	int length;         // 顺序表当前的长度 
} SqList;

主函数 main

1.1 初始化顺序表

  • 初始化数据,方便测试
  • 初始化顺序表长度
/** 
	1. 初始化循序表(静态分配) 
*/
void initList(SqList &L) {
	// 初始为data赋值
	int i=0;
	for( ;i<5; i++)
		L.data[i] = i; 
	L.length =i;
} 

/**
	1(动态分配的初始化)
*/

void initListAction(SqList &L) {
	// 为data分配空间 
	L.data = (int *)malloc(sizeof(int) * MaxSize);
	 // 初始为data赋值
	int i=0;
	for( ;i<5; i++)
		L.data[i] = i; 
	L.length =i;
} 

1.2 打印顺序表

  • 从第一个元素到最后一个元素,顺序打印
/** 
	2.循环遍历循序表 
*/
void PrintList(SqList L) {
	int i;
	for(i=0; i<L.length; i++){
		printf("%d\n", L.data[i]);
	}
	printf("---------------------------------------\n");	
}

1.3去除顺序表的重复元素

1.4 在第i个位置插入元素

  • 思想: 将第i个元素(下标为i-1)以及后面的元素向后依次移动。(初始j =len, 循环终止条件为 j<=i, 实际到j==就会终止了)
  • 还要注意一些不可插入的条件: i的范围(1,len+1), 其中的len+1表示最后一个元素后面一个。 对应的下标为(0, len)。
  • 当L.length 大于或者等于MaxSize的时候,表示表满了,不可再插入。
  • 插入成功后,表的长度加一
/**
	4. 在第i个位置插入元素 
*/ 

bool listInsert(SqList &L, int i, int el) {
	
	int j;
	
	// 判断一些不可插入的点
	// 了解可插入的点的范围 ( i表示的 第i-1下标)
	// (插入的范围为  1 - len加1 个位置, len+1的位置其实就是下标为len的位置) 
	// (所以 下标的范围为  0-len, 启动len表示最后一个元素下一个元素的下标)
	if(i<1 || i>L.length+1) {
		// 不在可插入范围内
		printf("i=(%d)不在可插入范围内\n", i);
		return flase; 
	} 
	 
	 if(L.length>=MaxSize) {
		// 顺序表满了
		printf("顺序表满了\n");
		return flase; 
	} 
	
	// 注意第i个元素的下标为(i-1) 
	// 从len开始,因为最后一个元素要放在下一个
	// 结束循环的下标为i,表示的第i+1个元素 
	for(j=L.length; j>=i; j--) { 
		L.data[j] = L.data[j-1];  // 用前一个覆盖后面的元素 
	}
	//  为第i个元素也就是下标为i-1赋值
	L.data[i-1] = el;
	// 长度加1 
	L.length++;
	
	// 插入成功返回ture
	return true; 
	
} 

1.5 删除指定位置的元素

  • 删除前先判断 要删除的范围是否符合规范 删除的位置i的范围为(1-len)
  • 删除的具体思想是, 将第i个位置后面的元素依次向前移动,也就是从i+1个位置(下标为i)的元素开始,椅子和遍历到最后一个元素len。
  • 遍历向前移动后,最后一个元素要清空
  • 表长度减一
/**
	5. 删除顺序表的某个元素并保存到e 
*/ 

bool ListDelete(SqList &L, int i, int &e){
	// 先判断一下删除的位置是否有元素(范围:1-len) 
	if(i<1 || i>L.length) {
		printf("删除的位置没有元素");
		return false;
	}
	
	// 如果在合理的删除范围
	// 先将删除位置i(下标:i-1) 对应的元素数值赋值给e
	e = L.data[i-1];
	
	// 将第i个位置以后的元素往前移动,最后一个元素的位置赋值0
	int j;
	for(j=i; j<L.length; j++) {
		L.data[j-1] = L.data[j];
	}
	
	// 最后一个元素赋值0
	L.data[j-1] = 0;
	
	// 返回删除成功
	printf("删除成功!\n");
	L.length--; 
	return true; 
} 

1.6 查找指定元素的位序

  • 注意位序是指的第几个 从 1 开始
  • 下标是从0开始
/**
	6. 查找指定元素的下标(返会第一个符合条件的元素位序(注意位序是指第几个,从1开始;下标从0开始)) 
*/
int locateElem(SqList L, int e) {
	int i;
	for (i=0; i<L.length; i++) {
		if(e == L.data[i])
			return i+1; 
	}
	
	// 如果没找到,返回-1 
	return -1;
}


未完结… 后期添加

你可能感兴趣的:(考研数据结构,数据结构,c)