老九學堂資料結構與演算法章節2課堂筆記上
阿新 • • 發佈:2018-11-04
線性表的定義
- 定義:零個或多個數據元素的有限序列
- 特點:
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個位置的資料元素返回給elemendADT
順序儲存結構的線性表–順序表
- 線性表(a1,a2,a3,…,ai-1,ai,…,an)的順序儲存示意圖如下:
線性表的順序儲存結構,指的是用一段地址連續的儲存單元依次儲存線性表的資料元素 - 描述線性表的順序儲存結構需要三個屬性
A.定義線性表的最大儲存空間
B.定義資料元素
C.定義順序表表結構
#define max_size 255 typedef int elemtype; typedef struct { elemtype datas[max_size]; int length; char *name; ... }elemtype;
- 地址計算方法
(position 位置從1開始)
(index下標從0開始)
順序儲存結構的插入與刪除
- 順序表插入資料元素
- 將資料元素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;
}