C语言数据结构——动态顺序表

206 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

动态顺序表与静态顺序表的区别在于结构体的定义以及初始化

一、头文件与宏定义

  • 标准输入输出头文件
  • ElemType定义为元素类型int
  • 顺序表静态分配空间长度为6
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define MAXSIZE 6

二、结构体定义

  • 一个存放元素的数组,长度为MAXSIZE
  • 存放长度为len,len可以随着插入数据而改变
typedef struct{	
    ElemType *data;	//数据指针 	
    int maxSize;	//存放最大可分配顺序表长度 	
    int len;	//当前顺序表数据长度 
}Sqlist;

三、函数声明

  • 函数的总体思路为“创、销、增、删、改、查”
  • 必要操作:创--初始化、销--销毁、增--增加数据、删--删除数据、改--修改数据、查--查询数据
  • 数据完整性校验:数据表判断是否为空,数据表判断是否为满
  • 转换:人类常识“1”位置与计算机“0”位置的对应转换
void initList(Sqlist &list);	//初始化顺序表
bool isEmpty(Sqlist &list);		//判断顺序表是否为空
bool isFull(Sqlist list);		//判断顺序表空间是否已满 
void append(Sqlist &list,ElemType e);	//追加数据 
bool insert(Sqlist &list,int i,ElemType e); //在i位置插入数据e 
void print(Sqlist list);	//遍历数据 
int locateElem(Sqlist list,ElemType e);	//查找某个元素位置
ElemType getElem(Sqlist list,int i); //查找某个元素位置的值
bool deleteElem(Sqlist &list,int i); //删除某个位置的元素 

四、函数体

  • 初始化顺序表
/*	
function:初始化顺序表 	
param:Sqlist	
return:void
*/ 
void initList(Sqlist &list){	
    list.data = (int *)malloc(sizeof(int));	
    list.maxSize = MAXSIZE;	list.len = 0;
}
  • 判断顺序表是否为空
 /** 	判断顺序表是否为空  */ 
 bool isEmpty(Sqlist list){ 	
     if(list.len==0){ 		
         return true;	 
     }else{	 	
         return false;	
     }  
 } 
  • 判断顺序表空间是否已满
 /** 	判断顺序表是否已满 */ 
 bool isFull(Sqlist list){ 	
     if(list.len>=MAXSIZE){ 		
         return true;	 
     }else{	 	
         return false;	 
     } 
 }
  • 追加数据
/*	
function:顺序表 追加数据 	
param:Sqlist,ElemType	
return:void
*/ 
void append(Sqlist &list,ElemType e){	
    if(list.len<MAXSIZE){		
        list.data[list.len] = e;		
        list.len++;		
        printf("#结果>>>插入一条数据!\n"); 	
    }else{		
        printf("#结果>>>顺序表已满!\n"); 		
        return ;	
    }
}
  • 在i位置插入数据e
/*	
function:顺序表 在i位置插入数据 	
param:Sqlist,int,ElemType	
return:bool布尔值 
*/ 
bool insert(Sqlist &list,int i,ElemType e){ 	
    int index = i -1;	//位置转下标  	
    if(index<0||index>list.len||list.len>=MAXSIZE){
        //判断小标是否合法,顺序表是否已满  		
        return false;	 
    }else{	 	
        for(int j=list.len;j>index;j--){	
            //控制i位置开始的元素往后移动,腾出i位置的空间 	 		
            list.data[j] = list.data[j-1];		 
        }		 
        list.data[index] = e;	//在位置i插入数据e 		 
        list.len++;	//顺序表长度加1 		 
        return true; 	 
    }
}
  • 遍历数据
/*	
function:顺序表 遍历数据 	
param:Sqlist	
return:void
*/ 
void print(Sqlist list){	
    printf("#结果>>>"); 	
    for(int i=0;i<list.len;i++){		
        printf("%d ",list.data[i]);	
    }
}
  • 查找某个元素位置
/** 	查找元素位置  */ 
int locateElem(Sqlist list,ElemType e){ 	
    int index = -1; 	
    for(int i=0;i<list.len;i++){ 		
        if(e == list.data[i]){ 			
            index = i + 1;		 
        }	 
    }	 
    return index; 
}
  • 查找某个元素位置的值
/** 	查找某个位置的元素值  */ 
ElemType getElem(Sqlist list,int i){ 	
    if(i<1||i>list.len){ 		
        return -999;	 
    }else{	 	
        return list.data[i-1];	 
    } 	 
}
  • 删除某个位置的元素
/** 	删除某个位置的元素  */  
bool deleteElem(Sqlist &list,int i){ 	
    int index = i - 1;	//转位置为下标 	
    if(index<0||index>list.len){ 		
        return false;	 
    }else{	 	
        for(int j=index;j<list.len;j++){	 		
        list.data[j] = list.data[j+1];	 	
    } 	 	
        list.len--;	 
    }	  
}

五、函数入口

  • 数据表功能化操作
  • 循环控制数据操作
int main(){	
    Sqlist list;	
    int cmd;	
    while(true){		
        printf("\n\n--------操作顺序表(静态),最大长度为%d\n",MAXSIZE);		
        printf("操作:\n(1.初始化\t2.追加数据\t3.插入数据\t4.遍历数据\t\n5.删除数据\t6.按值查找数据\t7.按位置查找数据)");		
        printf("\n请输入操作:");		
        scanf("%d",&cmd);		
        printf("#############\n"); 		
        switch(cmd){			
            case 1:				
                //初始化顺序表 				
                initList(list);				
                break;			
            case 2:				
                //追加数据 				
                int appdata;				
                printf("输入追加数据的值:");				
                scanf("%d",&appdata);				
                append(list,appdata);				
                break;			
            case 3:				
                //插入数据 				
                int insertdata;				
                int insertlocate;				
                printf("插入数据:");				
                scanf("%d",&insertdata);				
                printf("插入的位置:");				
                scanf("%d",&insertlocate);				
                bool isInsert;				
                isInsert = insert(list,insertlocate,insertdata);				
                if(isInsert){					
                printf("插入成功!");				
                }else{					
                printf("插入失败,位置选择有问题……");				
                }				
                break;			
            case 4:				
                //遍历数据表 				
                print(list);				
                printf("\n"); 				
                break; 			
            case 5:				
                //删除数据 				
                int deletelocate;				
                printf("删除数据位置:");				
                scanf("%d",&deletelocate);				
                deleteElem(list,2);				
                break;			
            case 6:				
                //按值查找 				
                int searchvalue;				
                int number;				
                printf("查找某个值:");				
                scanf("%d",&searchvalue);				
                number = locateElem(list,searchvalue); 				
                printf("元素位置:%d",number);				
                break;			
            case 7:				
                //按序号查找 				
                int searchlocate;				
                printf("查找序号:");				
                scanf("%d",&searchlocate);				
                printf("第%d个元素的值为%d",searchlocate,getElem(list,searchlocate));				break;			
            default:				
                return -1;				
                break;		
        }		
        printf("\n");	
    }	
    return 0;
}

六、运行情况