1. 程式人生 > >老九學堂資料結構與演算法章節2課堂筆記上

老九學堂資料結構與演算法章節2課堂筆記上

線性表的定義

  1. 定義:零個或多個數據元素的有限序列
  2. 特點:
    A.它是一個序列
    a.資料元素之間是有序的
    b.資料元素之間是一對一的關係
    B.有限性
    (零個資料元素的有限序列又稱為空表)

線性表的抽象資料型別

線性表的常見操作:刪除,插入,建立和初始化,查詢,清空

ADT 線性表(sequencelist)
DATA
1.線性表資料元素是一個集合(a_1,a_2,a_3,…,a_n),資料元素的型別datatype(int,char,自定義)
2.除了第一個元素a_1外,每個元素有且只有一個直接的前驅元素
3.除了最後一個元素a_n外,每個元素有且只有一個直接的後繼元素
4.每個資料元素之間的關係是一對一的關係
Operation

  • initlist(*list)
    初始化線性表:建立一個空的線性表list
  • insertelement(*list,index,elem)
    線上性表list的index下標插入元素elem
  • deleteelement(*list,index,*elem)
    刪除線性表list中第i個元素,並返回刪除元素的指標elem
  • getlenth(list)
    返回線性表list中的元素個數
  • isempty(list)
    若線性表為空,返回true,否則返回false
  • clearlist(*list)
    清空線性表
  • exsitelem(*list,elem)
    線上性表L中查詢是否存在資料元素elem,存在則返回該元素在表中的下標,不存在返回-1
  • getelem(list,index,*elem)
    將線性表List中第i個位置的資料元素返回給elem

endADT

順序儲存結構的線性表–順序表

  1. 線性表(a1,a2,a3,…,ai-1,ai,…,an)的順序儲存示意圖如下:
    在這裡插入圖片描述
    線性表的順序儲存結構,指的是用一段地址連續的儲存單元依次儲存線性表的資料元素
  2. 描述線性表的順序儲存結構需要三個屬性
    A.定義線性表的最大儲存空間
    B.定義資料元素
    C.定義順序表表結構
#define max_size 255
typedef int elemtype;
typedef struct
{
elemtype datas[max_size];
int length;
char *name;
...
}elemtype;
  1. 地址計算方法
    (position 位置從1開始)
    (index下標從0開始)

順序儲存結構的插入與刪除

  1. 順序表插入資料元素
  • 將資料元素a插入到順序表下標為i的位置
    下標為i及下標為i以後的所有資料元素後移
    下標i的位置直接放入資料元素a
#include <stdio.h>
#include <string.h>
#define max 255
//1.定義資料元素
typedef struct
{
    int id;
    char *name;
}elementtype;
//2.定義順序表結構
typedef struct
{
    elementtype data[max];
    int length;
}Seqlist;
/**
*初始化順序表
*seqlist要初始化的順序表
*elemarray初始化時要新增的元素內容陣列
*length 初始化時新增的元素個數
*/
void initlist(Seqlist *seqlist,elementtype *elementarray,int length);
/**
*向順序表中的index下標處插入某個元素
*seqlist要初始化的順序表
*index 要插入的下標
*element要插入的元素
*/
void insertlist(Seqlist *seqlist,int index,elementtype element);
/**
*打印出相應陣列
*/
void printflist(Seqlist *seqlist);
void insertlist(Seqlist *seqlist,int index,elementtype element)
{
    //1.驗證插入後的元素空間是否超過max
    //2.index的值是否合法[0,max]
    //3.插入的index應該在length之內
    //4.從第length i個下標開始,前面一個元素賦值給後面一個元素
    if(seqlist->length+1>=max)
     {
         printf("陣列已滿插入失敗\n");
         return;
     }
    if(index<0||index>max-1)
    {
        printf("只能在允許的下標範圍內插入元素[0,%d]\n",max-1);
        return;
    }
    if(index>seqlist->length)
    {
        printf("插入的下標超過了陣列的最大長度-1,插入失敗\n");
        return;
    }
    for(int i=seqlist->length-1;i>=index;i--)
    {
        seqlist->data[i+1]=seqlist->data[i];
    }
    seqlist->data[index]=element;
    seqlist->length++;
}
void initlist(Seqlist *seqlist,elementtype *elemarray,int length)
{
    if(length>max)
    {
        printf("超出了陣列的最大容量,初始化失敗\n");
    }
    seqlist->length=0;
    for(int i=0;i<length;i++)
    {
        insertlist(seqlist,i,elemarray[i]);
    }
}
void printflist(Seqlist *seqlist)
{
    for(int i=0;i<seqlist->length;i++)
        printf("%d\t%s\n",seqlist->data[i].id,seqlist->data[i].name);
}
elementtype dataarray[]={
{1,"奇異博士"},
{2,"美國隊長"},
{3,"小魚"},
{4,"66"}
};
void test();
void test()
{
    Seqlist seqlist;
    initlist(&seqlist,dataarray,sizeof(dataarray)/sizeof(dataarray[0]));
    printflist(&seqlist);
}
int main()
{
    test();
    return 0;
}

在這裡插入圖片描述