线性表的顺序表示
这是在学习数据结构时为方便自己学习个人总结的代码,水平有限,大佬勿喷,有问题欢迎一起讨论.
单链表
仅包含有插入、删除和按值查找
/* 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;
}