当前位置 博文首页 > Inmaturity_7的博客:408计算机考研--数据结构--线性表学习(C语

    Inmaturity_7的博客:408计算机考研--数据结构--线性表学习(C语

    作者:[db:作者] 时间:2021-07-16 21:47

    线性表的学习

    1.线性表的顺序表示–顺序表

    1.1、顺序表的定义–静态分配
    #include <stdio.h>
    #define MaxSize 10 //定义最大长度 
    
    typedef struct{
    	int data[MaxSize];//用数组存储数据元素 
    	int length;//顺序表的当前长度 
    }SeqList;//顺序表的类型定义 
    
    
    //基本操作--初始化一个顺序表
    void InitList(SeqList &L){
    	for(int i=0;i<MaxSize;i++){
    		L.data[i]=0;//将所有的数据元素设置为默认初始值 
    	}
    	L.length=0;//顺序表的初始长度为0 
    } 
    int main(){
    	SeqList L;//声明一个顺序表
    	InitList(L);//初始化顺序表
    	return 0; 
    } 
    
    1.2、顺序表的定义–动态分配
    #include <stdio.h>
    #include <stdlib.h>
    #define InitSize 100 //表长度的初始定义长度 
    
    typedef struct{
    	int *data;//指示动态分配数组的指针 
    	int MaxSize,length;//数组的最大容量和当前个数 
    }SeqList;//顺序表的类型定义 
    
    
    //基本操作--初始化一个顺序表
    void InitList(SeqList &L){
    	L.data=(int *)malloc(sizeof(int)* InitSize);
    	L.length=0;//顺序表的初始长度为0 
    	L.MaxSize=InitSize;
    } 
    void IncreaseSize(SeqList &L,int len){
    	int *p=L.data;
    	L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
    	for(int i=0;i<L.length;i++){
    		L.data[i]=p[i];//将数据复制到新区域 
    	}
    	L.MaxSize=L.MaxSize+len;//顺序表最大长度增加Len
    	free(p); 
    }
    int main(){
    	SeqList L;//声明一个顺序表
    	InitList(L);//初始化顺序表
    	//测试数据 
    	L.data[0]=1;
    	L.data[1]=2;
    	L.data[2]=3;
    	L.length=3;
    	//测试打印 
    	printf("1:%d,2:%d,3:%d\n",L.data[0],L.data[1],L.data[2]);
    	//测试扩容 
    	IncreaseSize(L,5);
    	//测试扩容后打印 
    	printf("1:%d,2:%d,3:%d",L.data[0],L.data[1],L.data[2]);
    	return 0; 
    } 
    
    1.3、顺序表静态分配的插入、删除、按位查找和按值查找
    #include <stdio.h>
    #define MaxSize 10 //定义最大长度 
    
    typedef struct{
    	int data[MaxSize];//用数组存储数据元素 
    	int length;//顺序表的当前长度 
    }SeqList;//顺序表的类型定义 
    
    
    //基本操作--初始化一个顺序表
    void InitList(SeqList &L){
    	for(int i=0;i<MaxSize;i++){
    		L.data[i]=0;//将所有的数据元素设置为默认初始值 
    	}
    	L.length=0;//顺序表的初始长度为0 
    } 
    
    //基本操作--在顺序表L的位序i处插入元素e
    bool ListInsert(SeqList &L,int i,int e){
    	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处放入e 
    	L.length++;//长度加1 
    	return true;
    } 
    bool ListDelete(SeqList &L,int i,int &e){
    	if(i<1||i>L.length){//判断i的范围是否有效 
    		return false;
    	}
    	e=L.data[i-1];//将被删除的元素赋值给e
    	for(int j=i;j<L.length;j++){
    		L.data[j-1]=L.data[j];
    	} 
    	L.length--;
    	return true;
    	
    }
    //按位查找
    int GetElem(SeqList L,int i){
    	if(i<1||i>L.length){//判断查找位是否有效 
    		return false;
    	}
    	return L.data[i-1];
    } 
    //按值查找 
    int LocateElem(SeqList L,int e){
    	if(L.length<=0){
    		printf("查找的顺序表为空!");
    		return -1;
    	}
    	for(int j=0;j<L.length;j++){
    		if(L.data[j]==e){
    			return j+1;
    		}
    	}
    	return -1;
    } 
    //打印链表中的数据 
    void PrintList(SeqList L){
    	for(int i=0;i<L.length;i++){
    		printf("%d:%d ",i,L.data[i]);
    	}
    	printf("\n");
    }
    int main(){
    	SeqList L;//声明一个顺序表
    	InitList(L);//初始化顺序表
    	//测试数据 
    	L.data[0]=1;
    	L.data[1]=2;
    	L.data[2]=3;
    	L.data[3]=4;
    	L.data[4]=5;
    	L.data[5]=6;
    	L.length=6;
    	PrintList(L);//测试打印 
    	//测试插入
    	ListInsert(L,3,3);
    	PrintList(L);//测试打印 
    	//测试删除
    	int e=0;
    	ListDelete(L,3,e);
    	PrintList(L);//测试打印 
    	
    	printf("查找第五个元素:%d\n",GetElem(L,5)); 
    	printf("查找元素6所在的位置:%d\n",LocateElem(L,6)); 
    	printf("查找元素7所在的位置素:%d\n",LocateElem(L,7)); 
    	return