线性表的基本操作

线性表的顺序表示

这是在学习数据结构时为方便自己学习个人总结的代码,水平有限,大佬勿喷,有问题欢迎一起讨论.

单链表

仅包含有插入、删除和按值查找

/* Note:Your choice is C IDE */
//Visual C++6.0编译器
#include "stdio.h"

#define False 0
#define True 1
#define maxsize 50
typedef char Elemtype;
//定义一个顺序表类型
typedef struct{
	//也可以是动态分配
	/*
		Elemtype *data;
		int maxsize,length; //定义数组的最大容量以及当前元素个数
	//动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句(malloc函数)分配的,一旦分配的空间被占满,可以另外开辟一块更大的内存区域,用以代替原来的存储空间。
	*/
	//可以用数组实静态分配
	Elemtype  data[maxsize];
	int length;	
}Sqlist;

void Initlist(Sqlist *L){
	L->length = 0;
	printf("    初始化成功\n");
}

//插入算法 i代表插入位置  e代表插入元素
int Insertlist(Sqlist *L,int i,Elemtype e){
	int j=L->length;
	//首先判断i的位置是否合法
	if( i>L->length+1 || i< 1){
		printf("位置不合法\n");
		return False;
	}	
	//判断是否存储空间已满
	if(L->length >= maxsize){
		printf("存储空间已满\n");
		return False;	
	}
	//进行元素位置移动
	for(;j>=i;j--){
		L->data[j] = L->data[j-1];
		printf("ss"); 	
	}
	L->data[i-1] = e;
	L->length++;
	printf("插入成功\n");
	return True;
}
//删除操作 顺寻标指针  删除元素位置  删除元素的数据
int  Deletelist(Sqlist *L,int i,Elemtype *e){
	//判断删除位置是否合法  如果位置大于长度则不合法
	int j = 0;
	if(i<1 || i>L->length)
		return False;
	//删除元素过后所有其之后的元素向前移动
	*e = L->data[i-1];
	for(j=i;j<L->length;j++){
		L->data[j-1] = L->data[j];	
	}
	//线性表长度减少1
	L->length--;
	printf("删除成功...");
	return True;
}
//按值查找函数
int Locatelist(Sqlist L,Elemtype c){
	int i = 0;
	for(i;i<L.length;i++){
		if(L.data[i] == c){
			printf("查找值的位置在第%d个\n",i+1);
			return i+1;
		}	
	}	
	printf("表中无此值");
	return False;	 //没有提前进行退出,说明查找失败
}

//判断线性表是否为空函数
int Emptylist(Sqlist L){
	//如果长度为0 则表示线性表为空
	if(L.length == 0)
		return True; 
	else 
		return False;
}
//循环函数  将列表中的元素进行循环左移动p个位置
int  Looplist(Sqlist *L,int p){
	if(p<0 || p>L->length){
		printf("输入的移动位数不合法\n");	
		return False;
	}
	//应该还能优化,我懒得写了
	int i,j;
	//定义 一个中间变量
	Elemtype t;
	//将第一个元素的值付给s
	Elemtype s = L->data[0];
	for(i=0,j=0;j<L->length;j++){
		//从第一个位置开始做移动 将目标位置的值进行保存
		//对移动目标位置进行计算 未防止出现负数 可以加上长度再进行取余运算(和循环队列思想一致)
		t = L->data[(i+L->length-p)%L->length];
		printf("第%d个位置移动后目标位置数据为%c\n",i+1,t);
		//将目标位置进行赋值第一个 
		L->data[(i+L->length-p)%L->length] = s;	
		//将t中存储位置的元素下标给i
		i = (i+L->length-p)%L->length;
		//将目标存储元素的数据进行保留
		s = t;
		printf("%d\n",i);
	}
	return True;
}
Sqlist L;

int main()
{
	Elemtype count[6]="zhang";
	int i=0;Elemtype c;
 	Initlist(&L);
 	开始插入元素  5
 	for(i=0;count[i] !='\0';i++){
 		//插入数据  尾插法
 		Insertlist(&L,L.length+1,count[i]);	
 	}
 	printf("删除前第一个位置元素是:%c\n",L.data[0]);
 	Deletelist(&L,1,&c);
 	printf("删除的元素是:%c\n",c);
 	printf("删除后第一个位置元素是:%c\n",L.data[0]);
 	Locatelist(L,'h');
 	return 0;   
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值