线性表之链表2019-11-17

线性表的链式存储表示的特点是用一组任意的存储单元存储线性表数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素 与其直接后继数据元素 之间的逻辑关系,对数据元素 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。由这两部分信息组成一个"结点"(如概述旁的图所示),表示线性表中一个数据元素

对于非线性的链表,可以参见相关的其他数据结构,例如树、图。另外有一种基于多个线性链表的数据结构:跳表,插入、删除和查找等基本操作的速度可以达到O(nlogn),和平衡二叉树一样。

其中存储数据元素信息的域称作数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)。指针域中存储的信息又称做指针或链。

由分别表示,,…,的N 个结点依次相链构成的链表,称为线性表的链式存储表示,由于此类链表的每个结点中只包含一个指针域,故又称单链表或线性链表。

以下代码实现过程:(头不为空)

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *next;  //后继指针
};
int Length(struct node *head)//求表的长度
{
    struct node *t=NULL;
    t=head;
    int n=0;
    while(t!=NULL)
    {
        t=t->next;
        n++;
    }
    return n;
}
int  search1(struct node *head,int index)//根据序号查找返回值
{
   struct node *t=NULL;
   t=head;
   int j=1;
   while(t!=NULL&&j<index)
   {
       t=t->next;
       j++;
   }
   if(index==j)
   return t->data;
   else
    return 0;
}
 int search2(struct node *head,int x) //按值查找返回位置
 {
    struct node *t=NULL;
    t=head;
    int j=1;
    while(t!=NULL&&t->data!=x)
    {
        t=t->next;
        j++;
    }
    if(t->data==x)
    return j;
    else
    return 0;
 }
 void Delete(struct node *head,int index) //删除链表中某个位置的
 {
    struct node *t=NULL,*q=NULL;
    t=head;
    int j=1;
    while(t!=NULL&&j<index-1)
    {
       t=t->next;
       j++;
    }
    q=t->next;
    t->next=q->next;
    free(t);
    t=head;
    while(t!=NULL)
    {
        printf("%d ",t->data);
        t=t->next;
    }

 }
 void AllDelete(struct node *head)  //整个表的删除
 {
     struct node *t=NULL,*q=NULL;
     t=head;
     while(t!=NULL)
     {
         q=t->next;
         free(t);
         t=q;
     }
     head=NULL;

 }
int main()
{
   struct  node *head=NULL,*p,*q=NULL,*t=NULL;  //初始化为空
   int n,i,a;
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
        scanf("%d",&a);
        p=(struct node *)malloc(sizeof(struct node)); //分配动态空间
        p->data=a;
        p->next=NULL;
        if(head==NULL)
            head=p;
        else
            q->next=p;  //q作为临时保存
        q=p;
   }
   printf("表的长度:%d\n",Length(head));
   printf("位置1的值:%d\n",search1(head,1));
   printf("值为4的位置%d\n",search2(head,4));
   Delete(head,3);//删除位置为3的节点
    scanf("%d",&a);    //插入
    t=head;
    while(t!=NULL)
    {
        if(t->next->data>a)  //找到位置
        {
            p=(struct node *)malloc(sizeof(struct node));
            p->data=a;
            p->next=t->next;  //后接
            t->next=p;     //前接
            break;
        }
        t=t->next;
    }
     //输出
    t=head;
    while(t!=NULL)
    {
        printf("%d ",t->data);
        t=t->next;
    }
    AllDelete(head); //删除整个表

}

原文地址:https://www.cnblogs.com/julyzqy/p/11877102.html

时间: 2024-10-10 21:40:12

线性表之链表2019-11-17的相关文章

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

C语言 严蔚敏数据结构 线性表之链表实现

博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直接上代码,现阶段代码实现功能有:链表初始化.遍历.增.删.返回链表长度,后续功能陆续发布.其中肯定有很多问题,希望各位码哥留言. Linklist* InitList(int i)//i为链表大小 { Linklist *head; head = (Linklist*)malloc(sizeof(L

JAVA实现具有迭代器的线性表(单链表)

一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用到依次遍历单链表中的每一个元素.一般而言,我们就是用for循环来实现遍历,这样,当你新增一个对单链表的操作并需要使用遍历时,你就得重新写一个for循环而实现遍历.那么,为什么不将迭代(遍历)作为一种基本的ADT操作(基本的ADT操作如:新增一个元素.删除一个元素)呢?于是,迭代器就出场了. 2,鉴于

Python线性表——单链表

1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继. 数据结构中常见的线性结构有数组.单链表.双链表.循环链表等.线性表中的元素为某种相同的抽象数据类型.可以是C语言的内置类型或结构体,也可以是C++自定义类型. 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界.C语言中定义一个数组: 数组下标是从0开始的

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl

数据结构之线性表(链表)

链表 1.链表的定义:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是 连续的,也可以是不连续的).因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素 ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置).这两部分信息组 成数据元素ai的存储映像,称为结点.它包括两个域,其中存储数据元素信息的域称为数据域:存储直接后继存储位置的 域称为指针域.指针域中存储的信息称做指针或链.n个结点

第二章:3.线性表---静态链表的表示和实现

前言: 由于一些高级程序设计语言中,并没有 "指针" 类型,因此上一节中用指针来描述的单链表不能被实现,这时候我们就会使用另一种形式链表:静态链表. 目录: 1.线性表的链式表示和实现 1.1线性链表 单链表(指针型线性链表) 静态链表 1.2循环链表 1.3双向链表 正文: 线性表的静态单链表存储结构: #define MAXSIZE 100; //链表的最大长度 typedef   struct{ ElemType  data; int  cur; }component, SLin

再回首,数据结构——线性表、链表上的常见算法

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. //1.编写算法实现线性表就地逆置的操作 void InverseList (SeqList l) { for (i = 0; i <= (l.length-1)/2; i++) { l.elem[i] <-> l.elem[l.length-1-i]; } } //2.从顺序表中删除自第i个元素开始的k个元素 void DeleteList(SeqList l, int

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数

3、蛤蟆的数据结构笔记之三线性表单项链表实现

今天励志短语:"人生的价值,即以其人对于当代所做的工作为尺度." 昨天我们看了线性表的一些定义概念,今天来看下其中的单项链表代码如何实现. 1.  声明结构 如下声明一个指向结构的指针.(存放整数的节点,我们也可以根据需要创建字符的链表) typedef struct list_node *list_pointer; typedef struct list_node{ intdata; list_pointerlink; }; list_pointerptr = NULL; 2.  定