第二讲线性结构

本文深入探讨了数据结构中的线性结构,包括数组和链表的特点及应用,对比了它们的优缺点,并详细介绍了链表的创建过程。此外,还讨论了队列和栈这两种特殊线性结构的工作原理。

在这里插入图片描述
简单来说像这样的犹如一条线的结构就属于线性结构 常见有我们熟知的数组还有单链表。

数组

在学数据结构之前我们对数组就很了解了,最简单的就是一维数组,一维数组也是最简单的线性结构。
优点:
1.访问方便,之间访问下标对应元素即可
2.写起来也方便用起来也方便看着也舒服
缺点:
1.在中间位置插入元素时,其后所以元素都需要后移,造成时间的大量浪费
2.有时不能准确确定需要开多大,对内存造成浪费

链表

链表在学数据结构之前我们是比较陌生的,但数据结构中用的就比较多了,特别是后面树和图。
有点
1.插入删除方便
2.需要时可以申请内存,不需要的结点可以随时删除,比较灵活
缺点
1.操作较为复杂
2.涉及到指针,可能理解起来有些难,而且很容易弄错

链表的建立:

#include<stdio.h>
#include<stdlib.h> // 申请内存必备头文件
struct lb
{
    int data;
    struct lb*next;
} lb;
int main() 
{
    struct lb *head1,*q,*p;
    int n,m,i,j,k;
    scanf("m=%d",&n);
    
    head1=NULL;
    for(i=0; i<n; i++) {
        scanf("%d\n",&j);
        p=(struct lb*)malloc(sizeof(struct lb)); // 动态申请内存
        p->data=j;
        p->next=NULL;
        if(head1==NULL)head1=p;
        else q->next=p;
        q=p;
}

双线链表与循环链表,则要在结构体中加入一个指向前一个元素的指针

#include<stdio.h>
#include<stdlib.h>
struct lb 
{
    int data;
    struct lb*next;
    struct lb*before;
};

int main() 
{
    struct lb *p,*q,*head,*tail,*t;
    int m,sc,cr,ys,ks,i,j,flag;
    while(scanf("%d",&m)!=EOF) 
    {
        head=NULL;
        for(i=1; i<=m; i++) 
        {
            p=(struct lb*)malloc(sizeof(struct lb));
            scanf("%d",&j);
            p->data=j;
            p->next=NULL;
            p->before=NULL;
            if(!head)head=p;
            else {
                q->next=p;
                p->before=q;
            }
            q=p;
        }
        q->next=NULL;
        tail=q;
        tail->next=head;
        head->before=tail;
}

队列

顾名思义,就像我们去食堂排队吃饭一样,谁先到谁就先买到饭然后离开
队列:先进先出
添加元素与栈相同,都是添加在末尾,而弹出元素则是弹出首位
我学到的算法BFS就是队列运用的很好例子
https://vjudge.net/contest/353252#problem/D
此题就运用BFS算法

如下为核心部分入队操作:
head 表示 队首tail 表示 队尾
每次有新成员加入,则队尾tail下标后移;假如有人出队,则删除head当前位置元素,然后将head后移。

while(head < tail)
		{
				for(int i = 0; i < 6; i++)
				{
					int tl, tr, tc;
					tl = a[head].l + next[i][0];
					tr = a[head].r + next[i][1];
					tc = a[head].c + next[i][2];
					
					if(tl < 0 || tl >= l || tr < 0 || tr >= r || tc < 0 || tc >= c || b[tl][tr][tc] || s[tl][tr][tc] == '#')
						continue;
						
					a[tail].l = tl;
					a[tail].r = tr;
					a[tail].c = tc;
					a[tail].step = a[head].step + 1;
					tail++;
					
					b[tl][tr][tc] = 1;
					if(s[tl][tr][tc] == 'E')
					{
						flag = 1;
						break;
					}
				}
				
			if(flag)
				break;
			head++;
		}

栈:先进后出
添加元素与队列相同,都是添加在末尾,而弹出元素则是弹出尾位
我们平常用浏览器
在这里插入图片描述退位键就是典型的栈,我们最先点进的网页我要退到此网页,我们则需要退回到最后一个网页(模拟一下就知道了),这就是典型的先进后出。
还有著名的逆波兰序列也运用了栈知识。

head 表示 队首tail 表示 队尾
每次有新成员加入,则队尾tail下标后移;假如有人出栈,则删除tail当前位置元素,然后将tail前移。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值