栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言可变长顺序表学习 (一个编程笨蛋写的~估计也没人看嘻嘻)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言可变长顺序表学习 (一个编程笨蛋写的~估计也没人看嘻嘻)

day1:顺序表的初始化 插入和输出(一点一点消化 搞懂每一行!)

第一块:对基本变量结构的认识

  2行: 重定义 Elemtype(element type)原因:方便顺序表表中元素的数据元素类型可变

  5行:使用指针变量 *slist原因:可变长顺序表便意味着系统给顺序表分配的空间可变,但当我们元素少时可能就分配一小块空间,要增加元素个数后面如果没有空间可分配,系统变会开辟一片新的连续存储空间 。这片空间我们不能给一个明确的名称,但是可以用一个指针变量指向这一块空间第一个元素的基地址

 第二块:顺序表的初始化 一定要有返回值,可以没有输入一定要有输出

只有初始化return 返回 1整个顺序表才可以继续进行操作 (算法的健壮性)

PS 我后续把第六行的 #define ERROR 0换成了 #define ERROR -1望周知

  13行为何参数表用 *L :C语言本质上只有值传递,但是如果运用指针传递地址便可以做到引用传递的效果,我们对形参L进行了处理便可对实参 Sq顺序表进行初始化

14行动态内存分配的解释:malloc函数中的右()中的内容是申请空间的字节数 init_size为所需空间,sizeof()计算每片空间的字节数。malloc前面的()是强制类型转换,由于顺序表中元素均为Elemtype型且L->slist为指针变量 故强制类型转换为 Elemtype型的指针变量

后续补上 15 !L->slist   L!=NULL(L)两种表示意思相同

第三块:顺序表的插入

无需初始化一批数据的原因:一开始的插入本质上就是对最开始的数据初始化(后面自己又补充说明了一点点)

 插入算法: 1.判断插入位置是否合理

                    2.判断顺序表元素个数是否已经到达总长,如果是变要为顺序表重新分配空间

                    3.插入算法的执行

                    4.每插入一个新元素元素个数+1

                    5.要有返回值,不然无法判断插入是否成功

   realloc函数理解: realloc()相比较于malloc()在于()内多写了一个L->slist 

                                原因:malloc是对顺序表初始化一片空间,而realloc是对已经初始化的一片空间的大小进行改动,所以函数内要对初始化的空间进行说明

后记对于初始化顺序表函数和插入函数是一个函数的小说明:在我们初始化的时候,InsertSq函数中for语句根本不会执行(自己要用草纸试一试),我们初始化后再插入某个数的时候for语句才会生效!

第四块:顺序表的输出

 一个简单的小循环

day1的完整源码(DEV C++编译成功!)

#include 
#include    //调用malloc函数需要引用该编译预处理 
#define INIT_SIZE 5
#define INCREM 3
#define OK  1
#define ERROR -1
typedef int Elemtype;
typedef struct Sqlist{
    Elemtype *slist;  //用于存放顺序表的连续单元 
    int length;       //顺序表表长 
    int listsize;     //顺序表空间大小 
}Sqlist;
 int InitSqlist(Sqlist *L) //初始化顺序表 
 { L->slist=(Elemtype*)malloc(INIT_SIZE*sizeof(Elemtype));
   if(!L->slist) return ERROR;  //初始化失败 返回0 
   L->length=0;                 //初始化成功 表中元素为0 
   L->listsize =INIT_SIZE;      //初始化成功 表长设置为宏定义的初始化数值 
   return OK;
 	
 }
 int InsertSqlist(Sqlist *L,Elemtype e,int i)   //e为插入元素  i为插入位置 
 {  if(i<1||i>L->length+1)                //判断插入位置是否合理 
   {
 	return ERROR;
   }
    if(L->length>L->listsize)       //判断元素个数是否已经超过表长 
	{
    	L->slist=(Elemtype *)realloc(L->slist,(L->listsize+INCREM)*sizeof(Elemtype));
    	if(L->slist=NULL) return ERROR;
    	L->listsize +=INCREM;
	}
	int j;  					   //插入算法的执行 
	for(j=L->length-1;j>=i-1;j--){
		L->slist[j+1]=L->slist[j];
	}
	L->slist[i-1]=e;              
	L->length ++;                //元素个数+1 
	return OK;					//返回值 
 	
 }
 void printSq(Sqlist *L) {
 	int i=0;
 	for(i;ilength;i++ )
 	{ 
 	   printf("%d",L->slist[i]);
 	   printf(" ");
	 }
 }
 int main(){
 	Sqlist Sq;
 	Elemtype e;
	int n;
	if(InitSqlist(&Sq))
	{ if(scanf("%d",&n)==1)
		{ int i;
		  for(i=0;i 
day2:顺序表的查找与删除(源代码主函数相较于day1有一些改动) 
1.顺序表的查找(输入查找的关键字值 输出其位序) 

 较为简单的一个遍历查找(想不出来写什么啦~)

主函数的一些小变动

2.顺序表的删除(输入位序,删除元素)

 删除算法: 1.判断删除位置是否合理

                    2.删除算法的执行

                    3.每删除一个元素,元素个数--

                    5.输出返回值,判断是否删除成功

 完整源代码

#include 
#include    //调用malloc函数需要引用该编译预处理 
#define INIT_SIZE 5
#define INCREM 3
#define OK  1         //宏定义 OK ERROR 原因:使得代码更具可读性 
#define ERROR -1
typedef int Elemtype;
typedef struct Sqlist{
    Elemtype *slist;  //用于存放顺序表的连续单元 
    int length;       //顺序表表长 
    int listsize;     //顺序表空间大小 
}Sqlist;
 int InitSqlist(Sqlist *L);                     //顺序表初始化函数 
 int InsertSqlist(Sqlist *L,Elemtype e,int i);  //顺序表插入函数 (含初始化一批数据)
 int SearchSqlist(Sqlist *L,Elemtype e); 		//顺序表查找函数 (输入数值 输入位序)
 int DeleteSqlist(Sqlist *L,Elemtype e);        //顺序表删除函数 (输入位序删除相应元素值)
 void printSq(Sqlist *L);						//顺序表输出函数  
 
 int InitSqlist(Sqlist *L) //初始化顺序表 
 { L->slist=(Elemtype*)malloc(INIT_SIZE*sizeof(Elemtype));
   if(!L->slist) return ERROR;  //初始化失败 返回0 
   L->length=0;                 //初始化成功 表中元素为0 
   L->listsize =INIT_SIZE;      //初始化成功 表长设置为宏定义的初始化数值 
   return OK;
}

 int InsertSqlist(Sqlist *L,Elemtype e,int i)   //e为插入元素  i为插入位置 
 {  if(i<1||i>L->length+1)                //判断插入位置是否合理 
   {
 	return ERROR;
   }
    if(L->length>L->listsize)       //判断元素个数是否已经超过表长 
	{
    	L->slist=(Elemtype *)realloc(L->slist,(L->listsize+INCREM)*sizeof(Elemtype));
    	if(L->slist=NULL) return ERROR;
    	L->listsize +=INCREM;
	}
	int j;  					   //插入算法的执行 
	for(j=L->length-1;j>=i-1;j--){
		L->slist[j+1]=L->slist[j];
	}
	L->slist[i-1]=e;              
	L->length ++;                //元素个数+1 
	return OK;					//返回值 
 	
 }
 
 int SearchSqlist(Sqlist *L,Elemtype e)
 {  
   int i=0;
   for(i;ilength;i++)
   {
   	if(L->slist[i]==e)
   	   {  
		printf("%dn",i+1);
		return OK; 
	   }
   } 
    printf("not exist!n");
    return 0;
 }
 int DeleteSqlist(Sqlist *L,int i)  //i为要删除元素的位序 
 {
     if(i<1||i>L->length)
	 { return ERROR;}
	 int j;   //执行删除算法 
     for(j=i;jlength;j++)
     { L->slist[j-1]=L->slist[j];
	 }
	 L->length--;
	 
	 return OK;
} 
 
 void printSq(Sqlist *L) 
 {
 	int i=0;
 	for(i;ilength;i++ )
 	{ 
 	   printf("%d",L->slist[i]);
 	   printf(" ");
	 }
 }
 int main(){
 	Sqlist Sq;
 	Elemtype e;
	int n,m;   //n为输入顺序表元素个数 m为要查找多少个元素 
	//初始化顺序表并初始化一批输入 (插入新元素再调用即可) 
	if(InitSqlist(&Sq))
	{ if(scanf("%d %d",&n,&m)==2)
		{ int i;
		  int t;
		  for(i=0;i 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311946.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号