首页 > 其他分享 >数据结构-链表2

数据结构-链表2

时间:2023-11-06 23:23:41浏览次数:47  
标签:body head temp int next 链表 line 数据结构

1、静态链表

这个给我的感觉就是数组加了索引,它的目的就是要融合顺序表和链表的优点,能够快速的访问元素,也能快速的增加或删除元素。

整个的组成如图所示,第一列的数据是位置,第二列是数据
image

2、双向链表

双向链表概念是区别于单链表而言的,就是多了一个前驱,组成示意图如下所示:
image

常见结构如下所示:

typedef struct line{
    struct line *prior;
    int data;
    struct line *next;
}line;

下面创建双向链表,基本和单链表创建类似,跟着来

line *initLine(line *head)
{
    head = (line*)malloc(sizeof(line));
    head->prior=NULL;
    head->next=NULL;
    head->data=1;

    line *list=head;
    for(int i=2; i<=5; i++)
    {
        line *body=(line*)malloc(sizeof(line));
        body->prior=NULL;
        body->next=NULL;
        body->data=i;

        list->next=body; /*指向下一个节点*/
        body->prior=list;/*body的prior指向前一个*/
        list=list->next;/*更新当前list*/
    }
    return head;
}

基本操作的增删查改也类似,下面贴出完整代码:


#include <stdio.h>
#include <stdlib.h>

typedef struct line{
    struct line *prior;
    int data;
    struct line *next;
}line;

line *initLine(line *head)
{
    head = (line*)malloc(sizeof(line));
    head->prior=NULL;
    head->next=NULL;
    head->data=1;

    line *list=head;
    for(int i=2; i<=5; i++)
    {
        line *body=(line*)malloc(sizeof(line));
        body->prior=NULL;
        body->next=NULL;
        body->data=i;

        list->next=body; /*指向下一个节点*/
        body->prior=list;/*body的prior指向前一个*/
        list=list->next;/*更新当前list*/
    }
    return head;
}

void display(line *head)
{
    line *temp = head;
    while (temp)
    {
        if(temp->next == NULL)
            printf("%d\n", temp->data);
        else
            printf("%d <-> ", temp->data);
        temp = temp->next;
    }
}

line *insertLine(line *head, int data, int add)
{
    line *temp = (line*)malloc(sizeof(line));
    temp->data = data;
    temp->prior = NULL;
    temp->next = NULL;

    if(add == 1) /*插入到表头*/
    {
        temp->next = head;
        head->prior = temp;
        head=temp;
    }
    else{
        line *body = head;

        /*注册到插入位置的前一个节点*/
        for(int i=1; i<add-1; i++)
        {
            body = body->next;
        }

        if(body->next == NULL) /*如果这个位置是尾部*/
        {
            body->next = temp;
            temp->prior = body;
        }
        else{
            body->next->prior = temp;
            temp->next = body->next;
            body->next = temp;
            temp->prior = body;
        }
    }
    return head;
}

line *delLine(line *head, int data)
{
    line *temp = head;

    while (temp)
    {
        if(temp->data == data)
        {
            temp->prior->next = temp->next;
            temp->next->prior = temp->prior;
            free(temp);
            return head;
        }
        temp = temp->next;
    }
    printf("链表中无该元素 \n");
    return head;
}

int selectElem(line *head, int elem)
{
    line *t = head;

    int i = 1;
    while (t)
    {
        if(t->data == elem)
        {
            return i;
        }
        i++;
        t = t->next;
    }
    return -1; 
}

line *amendElem(line *p, int add, int newElem)
{
    line *temp = p;
    for(int i=1; i < add; i++)
    {
        temp = temp->next;
    }
    temp->data = newElem;
    return p;
}

int main()
{
    line *head = NULL;
    head = initLine(head);
    display(head);

    printf("链表中第 4 个节点的直接前驱是:%d\n",head->next->next->next->prior->data);
    
    head=insertLine(head, 7, 3);
    display(head);
    
    //表中删除元素 2
    head=delLine(head, 2);
    display(head);

    printf("元素 3 的位置是:%d\n",selectElem(head,3));
    //表中第 3 个节点中的数据改为存储 6
    head = amendElem(head,3,6);
    display(head);

    exit(0);
}

3、循环链表

也就是说,当链表里面的最后一个的指针指向头结点,这样就构成了一个循环的链表,当然就是说一个大链表内部也可能有小的环链。

下面看一个循环链表的创建:

typedef struct node
{
    int number;
    struct node *next;
}person;

person *initLink(int n)
{
    person *head = (person*)malloc(sizeof(person));
    head->number = 1;
    head->next = NULL;
    person *cyclic = head;

    for(int i=2; i<=n; i++)
    {
        person *body = (person*)malloc(sizeof(person));
        body->number = i;
        body->next = NULL;
        cyclic->next = body;
        cyclic = cyclic->next;
    }
    cyclic->next = head;
    return head;
}

完整的循环链表的增删查改的操作:

/*
2023 11 03 c语言中文网,数据结构-线性表

主要循环链表的创建
*/

#include <stdio.h>
#include <stdlib.h>

/*需要将表中最后一个节点的尾部指针指向头节点*/

typedef struct node
{
    int number;
    struct node *next;
}person;

person *initLink(int n)
{
    person *head = (person*)malloc(sizeof(person));
    head->number = 1;
    head->next = NULL;
    person *cyclic = head;

    for(int i=2; i<=n; i++)
    {
        person *body = (person*)malloc(sizeof(person));
        body->number = i;
        body->next = NULL;
        cyclic->next = body;
        cyclic = cyclic->next;
    }
    cyclic->next = head;
    return head;
}

void findAndKillK(person *head, int k, int m)
{
    person *tail = head;
    while (tail->next != head)
    {
        tail = tail->next;
    }
    person *p = head;
    while (p->number != k)
    {
        tail = p;
        p = p->next;
    }
    while (p->next != p)
    {
        for(int i=1; i<m; i++)
        {
            tail=p;
            p=p->next;
        }
        tail->next = p->next;
        printf("出列人的编号为%d \n", p->number);
        free(p);
        p = tail->next;
    }
    printf("出列人的编号为%d \n", p->number);
    free(p);
}

int main()
{
    printf("输入圆桌上的人数n:");
    int n;
    scanf("%d",&n);
    person * head=initLink(n);
    printf("从第k人开始报数(k>1且k<%d):",n);
    int k;
    scanf("%d",&k);
    printf("数到m的人出列:");
    int m;
    scanf("%d",&m);
    findAndKillK(head, k, m);

    exit(0);
}


标签:body,head,temp,int,next,链表,line,数据结构
From: https://www.cnblogs.com/lx2035/p/17814044.html

相关文章

  • 数据结构-队列
    一、概念1、队列的定义队列是仅限在一端进行插入,另一端进行删除的线性表。队列又被称为先进先出(FirstInFirstOut)的线性表,简称FIFO。2、队首允许进行元素删除的一端称为队首3、队尾允许进行元素插入的一端称为队尾二、接口1、可写接口(1)数据入队队列的插入操作,叫做入队。它是......
  • 数据结构
    数据的逻辑结构:线性逻辑结构:一对一除第一个和最后一个元素外,数据的每一个元素都有且只有一个直接前驱和一个直接后继树型逻辑结构:一对多有且只有一个称为根的数据元素;根没有前驱,其余的每个元素有且只有一个前驱,末端元素没有......
  • 三元组存以及十字链表的创建
    1#define_CRT_SECURE_NO_WARNINGS2#include<iostream>3#include<fstream>4#define_CRT_SECURE_NO_WARNINGS5usingnamespacestd;67structTripleArray8{9introw;//行10intcol;//列11intval;//值12};......
  • 【Java集合】数据结构与集合的神秘联系,一文读懂!
    上篇文章中我们对单列集合中常用的方法和遍历查询。通过本文章为我们解惑,好好的字符串用起来不就行了,为什么要用集合这些工具类?本篇文章将简要介绍数据结构,让读者了解它们在计算机中以何种结构方式存在。那么,什么是数据结构呢?下面我们来详细解释。数据结构1.1数据结构有什么用?......
  • 大二算法实验一用循环链表解决约瑟夫环
    题目约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的......
  • 数据结构与算法-数组
    什么是数组在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据数组的特点低效的插入和删除数组为了保持内存数据的连续性,会导致插入......
  • 数据结构之排序
    一.什么是稳定排序?排序后相等元素的相对位置不发生变化二.稳定排序有哪些?2.1.不稳定排序:快速排序、希尔排序、堆排序2.2.稳定排序:冒泡排序、插入排序、归并排序、基数排序三.各大排序算法3.1.稳定算法3.1.1.冒泡排序思想:通过两两比较不断将最大的数浮出水面。一次浮出一......
  • 数据结构的基本概念和术语
    数据(Data)数据:能输入计算机且能被计算机处理的各种符号的集合,信息的载体能被计算机识别,存储和加工包括:数值型的数据:整数,实数等  非数值型的数据:文字,图像,声音等;2.数据元素和数据项数据元素:是数据的基本单位,在计算机程序......
  • 【MySQL】MVCC机制、ReadView数据结构、匹配规则详解
    (目录)MySQLMVCC机制1.隔离级别在MySQLInnoDB存储引擎下,RC、RR基于MVCC(多版本并发控制)进行并发事务控制MVCC是**基于”数据版本”**对并发事务进行访问2.场景分析UNDO_LOG不是会被删除吗?中间数据万一被删了版本链不就断了?UNDO_LOG版本链不是立即删除,MySQL确保版......
  • 数据结构的初认识
    一般,我们将数据结构分为逻辑结构和物理结构。逻辑结构:是指数据对象中数据元素的相互关系。逻辑结构包括:集合结构,线性结构,树型结构,图形结构。       物理结构:是指数据的逻辑结构在计算机中的存储形式。根据物理结构的定义,我们实际上研究的的就是如......