第二章——线性表

线性表

一、定义

线性表是最常用且最简单的一种数据结构。

简而言之,一个线性表是n个数据元素的有限的序列。

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的

(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。by~百度百科

二、线性表的顺序表示和实现

1.顺序表示指的是用一组地址连续的储存单元依次储存线性表的数据元素。

通常用数组来描述数据结构中的顺序存储结构。

2.顺序表的实现(以int数组为例)

 1 typedef struct List
 2 {
 3     int *elem;  //存储空间地址
 4     int length; //当前长度
 5     int listsize; //当前分配的储存容量
 6 };
 7 bool InitList (List &L,int list_init_size)
 8 {
 9     L.elem=(int*)malloc(list_init_size*sizeof(int));
10     if(!L.elem)
11         return false;
12     L.length=0;
13     L.listsize=list_init_size;
14     return true;
15 }

3.顺序表的插入删除操作

 1 bool ListInsert(List &L,int pos,int date)
 2 {
 3     //在线性表的第Pos个位置之前插入元素date
 4     if(pos<1||pos>L.length+1)  //pos值不合法
 5         return false;
 6     if(L.length>=L.listsize)  //线性表已满
 7     {
 8         int *newbase = (int*)realloc(L.elem,L.listsize*2*sizeof(int));//改变指针指向的内存大小
 9         if(!newbase)
10             return false; //分配失败
11         //free(L.elem);
12         L.elem=newbase;
13         L.listsize=L.listsize*2;
14     }
15     int *q=&(L.elem[pos-1]);
16     for(int *p=&(L.elem[L.length-1]);p>=q;p--)
17     {
18         *(p+1)=*(q);
19     }
20     *q=date;
21     L.length++;
22     return true;
23 }

3.有序顺序表的合并操作

 1 bool MergeList (List La,List Lb,List Lc)
 2 {
 3     //合并两个非递减排序的线性表为新的线性表
 4     int *pa=La.elem;
 5     int *pb=Lb.elem;
 6     Lc.listsize=Lc.length=La.length+Lb.length;
 7     int *pc=Lc.elem=(int* )malloc(Lc.listsize*sizeof(int));
 8     if(!Lc.elem)
 9         return false;
10     int *pa_last=La.elem+La.length-1;
11     int *pb_last=Lb.elem+Lb.length-1;
12     while(pa<=pa_last&&pb<=pb_last)
13     {
14         if(*pa<=*pb)
15             *pc++=*pa++;
16         else
17             *pc++=*pb++;
18     }
19     while(pa<=pa_last)
20         *pc++=*pa++;
21     while(pb<=pb_last)
22         *pb++=*pb++:
23     return true;
24 }

三.线性表的链式实现(即链表)

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据结构(这组存储单元可以是连续的,也可以是不连续的)

线性表的链式存储结构其实又可以成为链表,可以在较低的复杂度情况下实现数据的插入与删除。

如同,链表就像一个链子,利用指针,将原本分散的一个一个元素串联起来。

1.链表结构的实现

typedef struct LNode
{
    int date;
    struct LNode *next;
}LNode,*LinkList;//LinkList作为头指针;

2.获得第i个元素的值

 1 bool GetElem(LinkList L,int i,int &e)
 2 {
 3     //当第i个元素存在时,将其值赋给e并返回true,否则返回false;
 4     LinkList p=L->next;
 5     int j=1;
 6     while(!p||j<i)
 7     {
 8         p=p->next;
 9         j++;
10     }
11     if(!p||j>i)
12         return false;
13     e=p->date;
14     return true;
15 }

3.合并两个有序链表

 1 bool MergeList_ (LinkList &La,LinkList &Lb,LinkList &Lc)
 2 {
 3     LinkList pa=La->next;
 4     LinkList pb=Lb->next;
 5     LinkList pc=LC=La;
 6     while(pa&&pb)
 7     {
 8         if(pa->date<=pb->date)
 9         {
10             pc->next=pa;
11             pc=pa;
12             pa=pa->next;
13         }
14         else
15         {
16             pc->next=pb;
17             pc=pb;
18             pb=pb->next;
19         }
20     }
21     pc->next=pa?pa:pb;
22     free(Lb);
23     return true;
24 }
时间: 2024-12-25 07:06:40

第二章——线性表的相关文章

数据结构期末复习第二章线性表

第二章:线性表 1.线性结构的基本特征答:线性结构是若干数据元素构成的有序(次序)集① 集合中必存在唯一的一个“第一元素”:② 集合中必存在唯一的一个 “最后元素”:③ 除第一元素之外,均有 唯一的前驱:④ 除最后元素之外,均有 唯一的后继. 2.线性表的顺序存储结构和链式存储结构分别是______.(  D )   A. 顺序存取的存储结构.顺序存取的存储结构  B. 顺序存取的存储结构.随机存取的存储结构   C. 随机存取的存储结构.随机存取的存储结构  D. 随机存取的存储结构.顺序存取

数据结构之第二章线性表之静态链式存储

1--特点:用一维数组来描述线性表,用游标代替指针指示节点在数组中的相对位置.不设“指针”类型的高级语言中适用链表结构. 2--线性表的静态链式存储结构 ////  静态单链表.h//  单链表的静态存储//// 6 //  Copyright (c) 2014年 dashuai. All rights reserved.// #ifndef SLIST_H#define SLIST_H#include <stdio.h>#include <stdlib.h> #define MA

第二章 线性表

2.1线性表类型定义 线性表描述:A=(a1,a2,...an);A为线性表的名称,ai为线性表 的数据元素. 线性表的离散定义:B=<A,R>,A包含n个结点(a1,a2,...an),R中只包含一个关系,即线性关系,R={(ai-1,ai)|i=1,2,....,n}, 一般的线性表的操作可以包含以下几种: * public linklist()  建立一个空的线性表. * public linklist(collection c)  将collection c中的数据依次建立一个线性表.

数据结构之第二章线性表之链式存储

1~~特点:逻辑上相邻的元素,他的物理位置不一定相邻,其实几乎是不像邻的.表中的元素只能顺序访问,插入,删除等操作只需修改指针而不需要移动元素,存储空间利用率高,表的容量可以动态变化.适合个数变化大的情况. 2--链式存储`的存储结构 typedef struct Node{ int data; struct Node *next; }NODE,*PNODE; 3~~线性表的基本操作 (1)线性表的的  插表头  建立算法 ” 插表头“方式得到的线性链表,元素存储的顺序和输入顺序相反,这与栈的特

数据结构之第二章线性表

1 线性表的顺序存储 (1)线性表的顺序存储特点:逻辑上相连的元素,物理位置也相连.可随机访问表中元素,表中的存储位置可以用一个简单的,直观的公式表示,但是插入和删除都要移动大量的元素,效率不高,适合元素个数变化不大的情况,此时,如数据元素按照一定的顺序存储,则称为顺序存储的有序表,简称为    静态表. (2)线性表的动态分配顺序存储结构 typedef struct{ Elemtype *elem; //存储空间起始地址 int length; //当前长度 int listsize; //

数据结构总结 第二章 线性表 抽象数据类型的具体实现

#include<stdio.h> #include<stdlib.h> #include<iostream> #define MAXSIZE 1000 #define ERROR 0 #define OK 1 using namespace std; typedef int Status; typedef int ElemType; /////////////线性表定义(顺序表)//////////////////////// typedef struct { Ele

《数据结构与算法》第二章 线性表

线性表 定义: 由n个特性相同 数据元素(即可有很多数据项)构成的有限序列,同时相邻数据元素之间存在 序偶 关系. 线性表中元素个数就是 表长 . 特点: ·存在唯一一个被称为 “第一个” 的数据元素(线性起点.起始结点): ·存在唯一一个被称为 “最后一个” 的数据元素(线性终点.终端结点): ·除第一个以外,结构中的每个数据元素均 只有一个前驱 : ·除最后一个外,结构中的每个数据元素均 只有一个后继 . 顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素

数据结构之第二章线性表~~继续

(3)顺序表的查找 int locatlink(PNODE head,int e,int (*compare)(int ,int )) {//在head中查询第一个满足条件的元素的位置,若不存在,则返回-1 i: while(i<head.length&&!(*compare)(head.elem[i],e)) ++i; if(i<head.length) return i; else return -1; } 有序表的合并 void hebing(PNODE head1,PN

第二章 线性表2(链接表)

3.5.2 链接表接口 链接表可以看成是一组结点序列以及基于结点进行操作的线性结果的抽象,或则说是对链表的抽象. 链接表的接口: 1 package com.datastructure.chapter03.interfaces; 2 3 import com.datastructure.chapter03.exception.InvalidNodeException; 4 import com.datastructure.chapter03.exception.OutOfBoundaryExce