首页 > 其他分享 >7.22数据结构

7.22数据结构

时间:2024-07-22 19:55:42浏览次数:15  
标签:int next 链表 ListPtr 数据结构 节点 7.22 指针

笔记

链表

一.链表的引入

1.1总结顺序表的优缺点

        1)优点:能够直接通过下表进行定位元素,访问效率高,对元素进行查找修改比较快

        2)不足:插入和删除元素需要移动大量的元素,效率较低

        3)缺点:存储数据元素有上限,当达到MAX后,就不能再添加元素了、

1.2链表的概念

        1)链式存储的线性表叫做链表

                1.链式存储:表示数据元素的存储地址不一定连续

                2.线性表:数据元素之间不存在一对一的关系

        2)链表的基础概念

                1.节点:节点是链表的基本单位,由数据域和指针域组成

                2.数据域:存放数据元素的部分

                3.指针域:存放下一个节点地址的部分

                4.前驱节点:当前节点的上一个节点

                5.后继节点:当前节点的下一个节点

                6.头节点:虚设的一个节点,数据域不存放数据元素,可以存放链表的长度

                7.头指针:指向第一个节点的指针称为头指针

                8.第一个节点:实际存储数据元素的链表上的第一个节点

                9.注意:头节点的指针域其实就是头指针,也可以单独定义一个指针,指向第一个节点

        3)链表的分类

                1.单向链表:只能从头节点或第一个节点出发,单向访问其后继结点的链表称为单向链表

                2.双向链表:从头部出发,既可以访问前驱节点,也可以访问后继结点

                3.循环链表:首尾相接的链表称为循环链表

二.单向链表

2.1节点结构体类型

        1)头节点和普通节点数据域可以合到一起,使用一格共用体表示

        2)指针域都是指向普通节点的地址

定义数据类型

        typedef int datatype

定义节点类型

        typedef struct Node

        {

                union

                {

                        int len;//头节点数据域

                        datatype data;//普通节点数据域

                };

                struct Node *next;//指针域

        };

2.2创建链表

        1)在堆区申请一格头节点的空间,就创建了一个链表

        2)需要对头结点的数据初始化链表长度,指针域初始化NIULL

三.双向链表

        1)所谓双向链表,就是从任意一个节点既能存储其前驱节点信息也能存储后继节点信息

        2)节点结构体中增加一个指向前驱节点的指针

        3)头节点没有前驱,最后一个节点没有后继

四.循环链表

        1)循环链表,就是首尾相接的链表

        2)单向循环链表:只需要将最后一个节点的指针域指向头节点即可

        3)双向循环链表:需要将最后一个阶段的指针域指向头节点,头节点的前驱指针指向最后一个阶段

作业

使用循环链表完成约瑟夫环问题

#include<myhead.h>
typedef int datatype;
typedef struct List
{
    union 
    {
        datatype data;
        int len;
    };
    struct List* next;
    
}List,*ListPtr;
ListPtr list_create_apply(datatype e)
{
    ListPtr temp1=(ListPtr)malloc(sizeof(List));

    if(temp1==NULL)
    {
        printf("创建失败!\n");
        return NULL;
    }
    temp1->next=NULL;
    temp1->data=e;

    return temp1;
}  
ListPtr  list_search_pos(ListPtr  L, int pos)
{
    //判断逻辑
    if(NULL==L || pos<0 || pos>L->len)
    {
        printf("查找失败\n");
        return NULL;
    }

    //查找逻辑
    ListPtr  q = L;
    for(int i=0; i<pos; i++)
    {
        q = q->next;
    }

    return q;
}
int list_insert_tail(ListPtr  L, datatype e)
{
    //判断逻辑
    if(NULL == L)
    {
        printf("插入失败\n");
        return -1;
    }
    
    //找到最后一个节点
    ListPtr  q = list_search_pos(L, L->len);
    
    //封装节点
    ListPtr p = list_create_apply(e);
    if(NULL == p)
    {
        return -1;
    }
    
    //插入逻辑
    p->next = q->next;
    q->next = p;
    
    //表的变化
    L->len++;
    printf("插入成功\n");
    return 0;

}
int main(int argc, char const *argv[])
{
    int num=0;
    int flag=0;
    ListPtr L=(ListPtr)malloc(sizeof(List));
    if(NULL==L)
    {
        printf("失败!\n");
        return 0;
    }
    L->next=L;
    L->len=0;
    printf("请输入约瑟夫环的人数:\n");
    scanf("%d",&num);
    printf("请输入要报数的数:\n");
    scanf("%d",&flag);
    for (int  i = 2; i <= num; i++)
    {
        list_insert_tail(L,i);
    }
    printf("%d",L->len);
    printf("出局的结果为:\n");
        L->data=1;
    while(L->next!=L)
    {

        for (int  i = 1; i < flag-1; i++)
        {
            L=L->next;
        }
        ListPtr temp=L->next;
        printf("%d\t",temp->data);
        L->next=temp->next;
        L=L->next;

    }
}    

标签:int,next,链表,ListPtr,数据结构,节点,7.22,指针
From: https://blog.csdn.net/2301_81236242/article/details/140599986

相关文章

  • 实训day11(7.22)
    1、环境准备(1)yum源(一个云仓库+pepl仓库) [root@web~]#vim/etc/yum.repos.d/hh.repo  [a] name=a baseurl=file:///mnt gpgcheck=0 [root@web~]#vim/etc/fstab  /dev/cdrom/mntiso9660defaults00 [root@web~]#mount-a [root@web~]#yumrep......
  • 云原生周刊:Kubernetes v1.31 中的移除和主要变更|2024.7.22
    开源项目ArgoRolloutsArgoRollouts是一个Kubernetes控制器和一组自定义资源定义(CRDs),提供高级部署功能,例如蓝绿部署、金丝雀部署、金丝雀分析、实验以及渐进式交付功能给Kubernetes。ArgoRollouts可选地集成了Ingress控制器和服务网格,利用它们的流量塑形能力,在更新期......
  • 24.7.22
    最近不知道为什么心脏后面靠近背的地方经常会痛,该不会是得什么大病了吧其实平常的时候有很多东西想写的,但是到了写的时候又会忘了或者不想写了灵感这种东西真的就是随时触发的说嗯,最近又开始从头看之前看到一半的遮羞艾莉了,感觉比第一次看的时候多了很多结合自身现状的感悟了,之......
  • 【数据结构】:链表实现洗牌功能
    此操作包含的基本功能有:组牌:组建52张扑克牌四种花色:“♥️”,“♠️”,“⬛️”,“♣️”每种花色13张牌:1~13洗牌:将52张扑克牌打乱顺序发牌:给三个人每人发5张牌扩展功能:清牌:将每人手中牌按照面值进行从大到小排序Card类在此类中,我们将完成对每一张牌的构造类......
  • 数据结构与算法总结——线性表
    目录2线性表2.1线性表的定义2.2线性表的基本操作2.2顺序表2.2.1顺序表的定义2.2.2顺序表的基本操作2.3链式表2.3.1链表的定义2.3.2链表的分类2.3.3单向链表2.3.3.1结点设计2.3.3.2链表的初始化2.3.3.3数据的插入2.3.3.4数据的删除2.3.3.5销毁链......
  • 手撕数据结构01--单链表(附源码)
    目录1.链表的概念和结构1.1链表的概念1.2单链表结构2.实现单链表2.1节点定义2.2链表功能2.3 创建节点2.4尾插2.5头插2.6打印2.7尾删2.8头删2.9查找2.10指定位置插入2.11指定位置之后插入2.12删除pos节点2.13删除pos之后的节点2.14销毁链表......
  • 01-复杂度3 二分查找 陈越、何钦铭数据结构
    题目可以满分通过的答案:`PositionBinarySearch(ListL,ElementTypeX){Positionleft=1;Positionright=L->Last;while(left<=right){Positioncenter=(left+right)/2;if(L->Data[center]>X){right=center-1;}elseif(L->Data......
  • 2024.7.22 test
    A你有序列\(A_i\),使得\(A_i\)增加\(1\)的代价是\(b_i\),问使得所有\(A\)互不相同的最小代价。\(n\le1e5,A_i\le1e9\)对于\(A_i\)相同的,取\(B_i\)最大的留下,剩下的都\(+1\),跟后面的继续比较。B你要求所有边\(or\)起来最小的生成树,\(q\)次询问,每次新加入一条权......
  • 数据结构-C语言-排序(3)
            代码位置:test-c-2024:对C语言习题代码的练习(gitee.com)一、前言:1.1-排序定义:        排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序)1.2-排序分类:常见的排序算法:插入排序a. 直接插......
  • 数据结构:基础概念
    一、相关概念概念相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构集合:所有数据在同一个集合中,关系平等。线性:数据和数据之间是一对一的关系树: 一对多图:多对多物理结构(在内存当中的存储关系)顺序存储:数据存放在连续的存储单位中(数组),逻辑关系和物理关......