数据结构基础

数据结构(data structure)是带有结构特性的数据元素的集合,在程序中经常有他的身影。由此可见它十分的重要。

目录

线性表

顺序表的操作总结起来就是四个字:增删改查

增加:


数据结构大概分为几个部分,分别是顺序表,链表,栈,树,算法等等。按逻辑关系来分,可分为四种 

        没有关系:处同一集合

        一对一关系:线性表,栈,队列

        一对多关系:二叉树

        多对多关系:图状结构

按存储关系可以分为

        顺序存储:数据紧挨在保存同块空间之中

        链式存储:数据随机存储在内存之中,通过指针将其链接。

线性表

按顺序存储的方式来存储的称为顺序表

顺序表一般会采用数组的方式进行存储,为了能够更好的遍历,需要添加一个变量来判断此时数组的长度。正是因为多了一个变量,此时的数组就不在适合用单纯的数组来表示,用结构体显得更加的合适。这就是顺序表的初始化。

//可以采用宏定义来确定数组的长度
#define N 10
typedefine int typedata;
struct stu{

typedata arr[N];

int len;

};

 有了一个初始化的顺序表,接下来就是对顺序表进行实例化。

实例化主要是为其开辟一块空间,这里我们用malloc开辟一块空间

struct stu *Order_Lisr_init(void)
{
        //开辟一块新空间用于存储
       sturct stu *p = (struc *stu)malloc(sizeof(struct stu));
        //判断空间是否开辟成功
        if(p == NULL)
            {
                //空间开辟错误直接打印出错信息,结束整个程序;
                perror("malloc error");
                retrun NULL;
              } 
        p->len = 0;
        return p;   
}

接下来就是对其进行操作

顺序表的操作总结起来就是四个字:增删改查

增加:

如图所示,如果我们要增加一个15到顺序表中,15可以有多个位置进行添加即0,1,2,3,4。这五个位置。

假设将其插在2这个位置中,为了保证后面的数据不会丢失,所以此时需要先将这个数据后移,即将

第一步移动

        len-1————》》len的位置移动。

        此处省略n步

最后一步移动:也就是我们要插入的位置loc向后移动一步,即

        loc——————》》loc+1

这时,基本思路就出来了,移动之后,总的长度需要加1,即

        len+1

下面是代码实现部分

void Order_List_add(struct stu *p,int loc,typedata data)
{
int i;
//判断位置是否合法
if(loc < 0 || loc>p->len)
    rentun;
//判断是否顺序表是否已经存满
if(p->len == N)
printf("数据已满");
    return;

//通过for循环来移动数据
for(i =p->len; i >= loc+1 i--)
    p->arr[i+1] = p->arr[i];

//存储数据
p->arr[loc] = data;

//长度加一
p->len++;

}

为了更好的测试这个功能,所以这时候需要一个遍历操作,代码如下。

void display(struct stu *p)
{
printf("遍历结果为")
int i;
for(i = 0; i < p->len; i++ )
    printf("%d ",p->arr[i]);
printf("\n");
}

增的代码就已经全部写完. 

第一步移动,因为删除代码之后,整个顺序表要往前移动

 

        i+1————》i的位置移动。

        此处省略n步

最后一步移动:

        len-1——————》》len-2

这时,基本思路就出来了.代码如下

void Order_List_del(struct stu *p,typedata data )
{

int i,j;
    whlie(i < p-len)
    {
        if(p->arr[i] == data)
            {
            for(j = i+1; j<p->len ;j++)
            
                p->arr[j-1]=p->arr[j];

            p->len--;

            countinue;   
             }
            i++;          


    }


}

即更新数据,这个思路和删除的思路有点相同,首先我们需要找到我们需要更新的数据,在输入我们想更新的数据即可

代码如下

void Order_list_updata(struct stu *p, typedata old,typedata new)
{
    while(i < p->len)
    {
        if(p->arr[i] == old)
               p->arr[i] = new;
    }

}

这就是整个顺序表的结构,下面一起来做个小题目测试一下吧。

 

#include "Order.h"

int main(void)
{
int ret,i;
	datatype data;
	
	struct stu*p = Order_init();
	if(p == NULL)
		return -1;
	printf("p:%p\n",p);
	
	// 测试 
	printf("开始\n");
	while(1)
	{
		ret = scanf("%d",&data);
		if(ret != 1)
			break;
		if(data>0)
		{
			for(i = 0; i< p->len;i++)
				if(data<p->arr[i])
					break;
				
			Order_add(p,i,data);
		}else if(data<0)
		{
			Order_del(p,-data);
		}
		display(p);
		
	}
	
	
}

结果

如下哈 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值