首页 > 其他分享 >每日记录(线性表链式存储结构(链表))

每日记录(线性表链式存储结构(链表))

时间:2023-06-05 23:47:21浏览次数:39  
标签:tmp 结点 线性表 next 链表 链式 指针 LNode

链表的基本概念
建议每次写的时候都加一个头节点

各结点由两个域组成:
数据域:存储元素数值数据
指针域:存储直接后继结点的存储位置

结点:数据元素的存储映像。 由数据域和指针域两部分组成
链表: n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构
单链表、双链表、循环链表:

结点只有一个指针域的链表,称为单链表或线性链表
有两个指针域的链表,称为双链表
首尾相接的链表称为循环链表
头指针是指向链表中第一个结点的指针

首元结点是指链表中存储第一个数据元素a1的结点

头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息

Q:1.如何表示空表?
有头结点时,当头结点的指针域为空时表示空表
Q:2. 在链表中设置头结点有什么好处

1.便于首元结点的处理 首元结点的地址保存在头结点的指针域中,所以在链表的第一个位置上的操作和其它位置一致,无须进行特殊处理;
⒉便于空表和非空表的统一处理

无论链表是否为空,头指针都是指向头结点的非空指针,因此空表和非空表的处理也就统一了。

头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值。

结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻

这种存取元素的方法被称为顺序存取法

优点

数据元素的个数可以自由扩充
插入、删除等操作不必移动数据,只需修改链接指针,修改效率较高
缺点

存储密度小
存取效率不高,必须采用顺序存取,即存取数据元素时,只能按链表的顺序进行访问(顺藤摸瓜)
前插法

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

#define over(i,s,t) for(register int i=s;i<=t;++i)
#define lver(i,t,s) for(register int i=t;i>=s;--i)
typedef long long ll;
//#define int __int128

typedef struct item
{
    //double coef;
    int expn;
}ElemType;


typedef struct Lnode//将struct Lnode命名为LNode
{
    ElemType data;        //数据域
    struct Lnode *next;   //指针域 是Lnode!
}LNode,*LinkList;//LNode类型的指针LinkList



//单链表的建立(前插法)

void InsertList(LNode *it,int val)//前插法//int index
{
    LNode *tmp;
    tmp=(LNode *)malloc(sizeof (LNode));
    tmp->data.expn=val;
    tmp->next=it->next;
    it->next=tmp;
}

//删除一个节点
void deletenode(LNode *it,int val)
{
    LNode *tmp=it->next,*last=it;
    while(tmp->data.expn!=val&&tmp->next!=NULL){

        tmp=tmp->next;
        last=last->next;
    }
    if(tmp==NULL){//没有数据域为a的结点
        //puts("没有,滚");
        puts("Not found");
    }
    else {
        last->next=tmp->next;
    }
    free(tmp);
}


//单链表的建立(尾插法)

int n,a[10000];


int main()
{
    scanf("%d",&n);
    over(i,1,n)
        scanf("%d",&a[i]);
    LNode *head;
    head=(LNode*)malloc(sizeof (LNode));
    head->next=NULL;
    lver(i,n,1){
        InsertList(head,a[i]);
    }
    deletenode(head,1);
    LNode *p;
    p=head->next;
    while(p!=NULL){
        printf("%d ",p->data.expn);
        p=p->next;
    }
    return 0;
}

还有循环链表:表最后的一个节点的指针指向表头

标签:tmp,结点,线性表,next,链表,链式,指针,LNode
From: https://www.cnblogs.com/xiao-hong111/p/17459307.html

相关文章

  • 每日记录(2.3双向链表)
    双向链表的基本概念双链表顾名思义,就是链表由单向的链变成了双向链。使用这种数据结构,我们可以不再拘束于单链表的单向创建于遍历等操作,大大减少了在使用中存在的问题。每一个节点都有两个指针分别指向该节点的前驱和后继。定义:structDuLNode{EtypedeflemTypedata;......
  • 每日记录(2.4线性表的应用)
    有序表的合并已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列。La=(1,7,8)Lb=(2,4,6,8,10,11)Lc=(1,2,4,6,7,8,8,10,11)0.新建一个链表新建一个空表C,直接在A和B中每次选取最小值......
  • 每日记录(数据结构 第二章 线性表() )
     线性表的定义:存在唯一一个“第一个”元素存在唯一一个“最后一个”元素除第一个元素外,每一个元素都有且只有一个前驱除最后一个元素外,每个元素都有且只有一个后继一、线性表顺序存储结构(顺序表)0.线性表的基本概念线性表强调元素在逻辑上紧密相邻,所以首先想到用数组存储。但是......
  • 顺序表 与 链表 的优缺点比较涅~( ̄▽ ̄)~*
    顺序表  优点是可以随机存取元素,存储密度高,结构简单;        缺点是需要一片地址连续的存储空间,不便于插入和删除元素(因为插入需要将大量的元素向后移动,删除需要将后续大量的元素向前覆盖),表的容量难以确定; 链表   优点是便于结点的插入与删除(只需要修......
  • 双链表
                                              《目录》简介建模辅助方法初始化出错处理空间申请迭代器链表算法尾插遍历头插尾删头删按值插入 查找求长度按值删除排序清除与销毁逆置单链表代......
  • c语言基于链表的文件存储与读取
    今天写了一下如何将链表中的数据存储到文件中head为链表的起始结点写入文件voidfilewirte(LinkListhead){LinkListfd;FILE*p=fopen("student_grad.txt","w");if(p==NULL){printf("没有东西");getchar();exit(1);}fd=head......
  • [学习笔记]数据结构_线性表_顺序表and单链表
    线性表线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构,两者属于不同层面上的概念。线性表的基本操作boolInitList(&L)//初始化表,构造一个空的线性表intLength(L)//求表长。返回线性表L的长度,即L中数据元素的个数intLocateElem(L,e)//按......
  • 链表:剑指 Offer 06. 从尾到头打印链表
    题目描述: 方法:递归法 classSolution{ArrayList<Integer>tmp=newArrayList<>();publicint[]reversePrint(ListNodehead){recur(head);intres[]=newint[tmp.size()];for(inti=0;i<res.length;i++){......
  • Gorm - 链式执行输出执行的SQL【gorm io版本】
    在GROM使用链式操作过程中,我们想要知道最终执行的SQL是什么,本文讲解三种常见的SQL日志打印方法。一、全局打印所有的SQL在gorm.io版本中,我们可以在建立连接时指定打印info级别的sql。import("time""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/go......
  • 反转链表
    反转链表最常用的就是双指针法了图解:首先,创建两个指针,begin和end,一个begin为空,一个end指向链表开头1。然后begin=end;end往后移动指向像一个节点,如下图重复以上步骤,直到end为空。代码如下/***Definitionforsingly-linkedlist.*structListNode{*intval;......