顺序结构的线性表(C语言)函数里面用的也是指针没有用c++的输入输出

废话不多话先上代码

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

typedef struct
{
	char *elem;
	int length;
}SqList;
//线性表初始化 
void InitList_Sq(SqList *p)
{   
	p->elem=(char*)malloc(sizeof(char)*MAXSIZE);
	p->elem[0]='A';
	p->elem[1]='B';
	p->elem[2]='C';
	p->elem[3]='D';
	p->elem[4]='E';
	p->length=5;
	printf("线性表初始化成功\n");
	}
//销毁线性表	
void DestroyList(SqList *p)
{
	if(p->elem)
	{
		free(p->elem);
	}
	printf("线性表已经摧毁\n"); 
	
}
//清除线性表 
void ClearList(SqList *p)
{
	p->length=0;
	printf("线性表已经清除\n"); 
}
//获取线性表的长度 
int GetLength(SqList *p)
{   
    
    int a;
    a=(p->length);
	return (a);
	
}
//判断线性表是否为空 
void IsEmpty(SqList *p)
{
	if((p->length)==0)
	{
		printf("线性表为空\n"); 
	}
	else
	{
		printf("线性表不为空\n"); 
	}
}
//获取某一位数据 
char GetElem(SqList *p,int i)
{   char a;
	if(i<1||i>(p->length))
	{
		printf("获取数据失败,不在数据范围内\n"); 
	}
	else
	{
		a=(p->elem[i-1]);
	    
		printf("获取数据成功\n"); 
		return a;
	}
 } 
//定位某一个数据在线性表中的位置 
int LocateElem(SqList *p,char b)
{
	for(int i=0;i<(p->length);i++)
	{
		if(p->elem[i]==b)
		{
			printf("查到到该元素\n");
			return i+1;
	    }
	}
	printf("未查到该元素\n");
	return 0; 
}
//插入某一个元素 
void ListInsert_Sq(SqList *p,int i,char a)
{
	if(i<1||i>p->length+1) 
	{
		printf("插入的位置不合法");
	}
	else
	{
		if(p->length==MAXSIZE)
		{
			printf("线性表已满无法插入\n"); 
		}
		else
		{
			for(int j=p->length;j>=i-1;j--)
			{
				p->elem[j]=p->elem[j-1];
				p->elem[i-1]=a;
				p->length++;
				printf("插入数据成功\n"); 
			}
		}
	}
 }
//删除某一个位置数据 
void ListDelete_Sq(SqList *p,int i)
{
	if(i<1||i>p->length)
	{
		printf("删除的位置不合法\n"); 
	}
	else
	{
		if(p->length==0)
		{
			printf("线性表已空无法删除\n"); 
		}
		else
		{
			for(int j=i-1;j=p->length-1;j++)
			{
				p->elem[j]=p->elem[j+1];
				p->length--;
			}
			printf("该位置的元素已经被删除\n"); 
		}
	}
 } 
int main()
{   int a;
    char b;
    SqList L1;
	SqList *L=&L1;
	InitList_Sq(L);
    IsEmpty(L);
    ListInsert_Sq(L,6,'G');
	a=GetLength(L);
	printf("%d\n",a);
	ListDelete_Sq(L,6);
	b=GetElem(L,6);
	printf("%c",b);
	DestroyList(L); 
}

这几天学习了一下顺序结构的线性表,并用c语言实现,首先十分感谢b站的王卓老师的数据结构课,讲的真的很好。

先来分享一下我自己的理解,这次是顺序结构的线性表,在逻辑上的两个元素挨着的话,在物理上也是挨着的,用数组实现。

线性表的初始化

typedef struct
{
	char *elem;
	int length;
}SqList;
//线性表初始化 
void InitList_Sq(SqList *p)
{   
	p->elem=(char*)malloc(sizeof(char)*MAXSIZE);
	p->elem[0]='A';
	p->elem[1]='B';
	p->elem[2]='C';
	p->elem[3]='D';
	p->elem[4]='E';
	p->length=5;
	printf("线性表初始化成功\n");
	}

这上面定义了一个的结构体,typedef是一个重定义,大家不懂的话可以先去学习一个这个typedef,线性表的初始化就是将元素存储在数组上,将逻辑上上挨着的两个元素,由于数组也是一个挨着一个,就可以体现逻辑。

销毁线性表

void DestroyList(SqList *p)
{
	if(p->elem)
	{
		free(p->elem);
	}
	printf("线性表已经摧毁\n"); 
	
}

上面初始化的结构体里定义了两个变量一个是数组,一个是length用来存取线性表的长度;我们这里用了free函数,也就是将申请到的地址给释放了,也就是将线性表销毁。

清除线性表

void ClearList(SqList *p)
{
	p->length=0;
	printf("线性表已经清除\n"); 
}

我们将length置0,线性表的长度就为0,可能还有一个疑问,呢数据不还是还在吗?,但这是数组如果你继续赋值数组里面的值将会被覆盖。

获取线性表的长度

int GetLength(SqList *p)
{   
    
    int a;
    a=(p->length);
	return (a);
	
}

即返回length的值。

判断线性表是否为空

void IsEmpty(SqList *p)
{
	if((p->length)==0)
	{
		printf("线性表为空\n"); 
	}
	else
	{
		printf("线性表不为空\n"); 
	}
}

也就是length的值是否为空

获取某一个数据

char GetElem(SqList *p,int i)
{   char a;
	if(i<1||i>(p->length))
	{
		printf("获取数据失败,不在数据范围内\n"); 
	}
	else
	{
		a=(p->elem[i-1]);
	    
		printf("获取数据成功\n"); 
		return a;
	}
 } 

利用数组这个很容易获取,注意数组是从0开始的。

定位元素的位置

int LocateElem(SqList *p,char b)
{
	for(int i=0;i<(p->length);i++)
	{
		if(p->elem[i]==b)
		{
			printf("查到到该元素\n");
			return i+1;
	    }
	}
	printf("未查到该元素\n");
	return 0; 
}

就是将数组中的元素全部遍历一遍。

插入一个元素

void ListInsert_Sq(SqList *p,int i,char a)
{
	if(i<1||i>p->length+1) 
	{
		printf("插入的位置不合法");
	}
	else
	{
		if(p->length==MAXSIZE)
		{
			printf("线性表已满无法插入\n"); 
		}
		else
		{
			for(int j=p->length;j>=i-1;j--)
			{
				p->elem[j]=p->elem[j-1];
				p->elem[i-1]=a;
				p->length++;
				printf("插入数据成功\n"); 
			}
		}
	}
 }

如果我们插入一个数据,那么我们就要进行其移位就是从最后开始移动,然后在插入这个元素,同时length加1。

删除某个元素

void ListDelete_Sq(SqList *p,int i)
{
	if(i<1||i>p->length)
	{
		printf("删除的位置不合法\n"); 
	}
	else
	{
		if(p->length==0)
		{
			printf("线性表已空无法删除\n"); 
		}
		else
		{
			for(int j=i-1;j=p->length-1;j++)
			{
				p->elem[j]=p->elem[j+1];
				p->length--;
			}
			printf("该位置的元素已经被删除\n"); 
		}
	}
 } 

如果我们是删除就要从删除的这个位置,将后面的元素往前移。同时length的值-1.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值