數據結構的(de)定義與類型分析(雷同學(xue))
時間:2018-07-26 來源:未(wei)知
數(shu)(shu)據結(jie)構的定義 :數(shu)(shu)據元素間的相(xiang)互關系
(DS)
數據(Data)定(ding)義 :即信息(xi)的載體(可以輸入(ru)計算(suan)器(qi)且能(neng)被計算(suan)機識別,存(cun)儲 和處理的符號總稱)
數(shu)據元素(su)定義(yi) :數(shu)據的基(ji)本元素(su)(即記錄)(若干(gan)基(ji)本項組(字(zi)段、數(shu)據結構)成)
數據類型定義(yi) :對元(yuan)素取值范圍與運算的(de)限定
數(shu)據存(cun)儲結構(gou) :
順序存儲 --將數(shu)據結構中(zhong)的各元素按照其邏輯順序存放(fang)在存儲器 的一片連(lian)續的存儲空間(jian)中(zhong)
鏈(lian)式存儲 --將數(shu)據結(jie)構中的各元素(su)分布(bu)在存儲器(qi)不同點,用(yong)地址或(huo) 鏈(lian)指針把(ba)他們(men)聯系(xi)起來的存儲結(jie)構
索(suo)引存儲(chu) --在數據存儲(chu)的同時建立一個附加索(suo)引表(biao)(biao),:索(suo)引存儲(chu)結構=數據文(wen)件(jian)+索(suo)引表(biao)(biao)
散列存(cun)(cun)儲(chu) --根(gen)據(ju)數(shu)據(ju)元素(su)的(de)(de)關鍵字key計算(suan)存(cun)(cun)儲(chu)地址然后數(shu)據(ju)元素(su)按地址存(cun)(cun)放,的(de)(de)這種存(cun)(cun)儲(chu)結構(gou)
p126頁
數據結構(gou)類型
數據(ju)結構關(guan)系:
物(wu)理關(guan)系(xi):順序(xu)關(guan)系(xi)、鏈式關(guan)系(xi)
運算關(guan)系:增(加(jia)),刪(除),改(修改),查(詢),排(序)
邏輯關系:
(結構)
集合(he) : 數據元素(su)間除同屬一集合(he)無其他關系
線性(xing)(xing): 線性(xing)(xing)(關系) :一對(dui)一(如線性(xing)(xing)表、棧、隊列)
非(fei)線(xian)性: 層次(ci)關(guan)系(樹狀結構) :一對多
網狀關系(圖狀結構(gou)) :多(duo)對多(duo)
算法特性(xing)(xing): (1)有窮(qiong)性(xing)(xing)---算法執(zhi)行(xing)的步驟或規則是有限的
(2)確定性---每個計算步驟無二義性
(3)可(ke)行(xing)性---每個(ge)計(ji)算步驟都能在有限時間內完成
(4)輸(shu)入---算(suan)法有(you)一個(ge)(ge)或多個(ge)(ge)輸(shu)入
(5)輸出---算法有一個或多個輸出 p128頁
評(ping)判算(suan)法好(hao)(壞): 消(xiao)耗時(shi)間(jian)少 、存(cun)儲空間(jian)少,
易(yi)(理解(jie) 編程 調試 和維(wei)護)的程度,
問題規模(mo)(小):(輸入數(shu)據(ju)量的大(da)小,用(yong)n表示)
算(suan)法(fa)(fa)消(xiao)耗(hao)的時間復雜(za)度 T(N):(算(suan)法(fa)(fa)消(xiao)耗(hao)的時間)
算(suan)法消耗的(de)空間(jian)復(fu)雜(za)度 D(N):(算(suan)法消耗的(de)空間(jian))
語(yu)句頻度: 可執行語(yu)句在算法(或程序)中重復執行的次數(shu)
(一條語(yu)句的時(shi)間復雜度=語(yu)句平度 *消耗時(shi)間) p129頁(ye)
算法與程序的聯系與區(qu)別(bie):
共同點(dian):二者(zhe)皆為完(wan)成某個任務(wu),或解決某個問(wen)題而編制(zhi)的規則(或語(yu)句)的 有序集合
區別 : 一,算法(fa)與計(ji)算機無關,但程序依賴于具體的計(ji)算機語言
二(er),算(suan)法必須有窮而程序可能無(wu)窮
三,算法(fa)可(ke)忽略(lve)一(yi)些語(yu)法(fa)細節問(wen)題,重(zhong)點放在解決問(wen)題的(de)思(si)路上, 但程(cheng)序(xu)必須(xu)嚴格按相應的(de)語(yu)言(yan)工(gong)具的(de)語(yu)法(fa)算法(fa)換(huan)成程(cheng)序(xu)后才能在計算機上運行。
線性表(biao)(biao): 是信息表(biao)(biao)的一種形式,數據元素(su)間滿足(zu)線性關系(xi)(或線性結(jie)構)
非空(kong)線性表的特征:
a0是表頭無前驅
a(n-1)是表尾無后繼
其他每個元素有且僅一個直(zhi)接(jie)前驅a(i-1)和直(zhi)接(jie)后繼a(i+1)
(當關系(xi)表長n<=1時,關系(xi)集R為空)
創建Makefile 文件(jian)
test:main.c seqlist.c
gcc main.c seqlist.c -o test
創建(jian)shell 文件(jian)
#ifndef SEQLIST_H
#define SEQLIST_H
#include
#include
#include
typedef int data_t;
#define size 15
typedef struct node{
data_t data[size];
int last;
}seqlist;
//增(zeng),刪,改(gai),查,排(pai)序等
seqlist *create_list();
int insert_list(seqlist *l, int pos, data_t value);
int delte_list(seqlist *l, int pos);
int change_list(seqlist *l, int pos, data_t value);
data_t select_list(seqlist *l, int pos);
void printf_list(seqlist *l);
#endif
創建(jian).c主程序文件
#include "seqlist.h"
#include
#include
#include
seqlist *create_list() //創建空表
{
seqlist *l; //創建鏈表指(zhi)針(zhen)
l = (seqlist *)malloc(sizeof(seqlist)); //開(kai)辟malloc空間并強轉
if (l == NULL){ //判斷(duan)是否為空,
return NULL;
}
memset(l->data, 0, 4*size); //把所有(you)空間初(chu)始(shi)化為(wei)0,memset初(chu)始(shi)化的(de)意思(si)
l->last = -1;
return l;
}
int insert_list(seqlist *l, int pos, data_t value)//插入數(shu)據
{
if (l == NULL) //首(shou)先判斷是(shi)否為空
return -1;
if (pos < 0 || pos > l->last + 1 || (l->last + 1 == size)) //判斷插入位置是(shi)否有效,無效返回-1
return -1;
int i;
for(i = l->last; i >= pos; i--)
l->data[i+1] = l->data[i];
l->data[pos] = value;
l->last = l->last + 1;
return 0;
}
int delte_list(seqlist *l, int pos)//刪(shan)除某一地(di)址下的數據(ju)
{
if(l==NULL || l->last == -1 )//同樣判斷刪除(chu)位置是否(fou)有效(xiao)
return -1;
if(pos < 0 || pos>l->last+1)
return -1;
int i;
for(i=pos; i
l->data[i] = l->data[i+1];
l->last--;
return 0;}
int change_list(seqlist *l, int pos, data_t value)//更(geng)改
{if (l == NULL)
return -1;
if (pos < 0 || pos > l->last + 1 )
return -1;
int i;
for(i = pos; i < l->last; i++)
l->data[pos] = value;
return 0;
}
data_t select_list(seqlist *l, int pos)//查詢
{if (l == NULL)
return -1;
else
return l->data[pos];
}
void printf_list(seqlist *l)//輸出函數
{
int i = 0;
printf("seqlist : l->last = %d\n", l->last);
while(i <= l->last){
printf("----%d ", l->data[i]);
i++;
}
printf("\n");
}
創建(jian)主函數調用
#include "seqlist.h"
#include
#include
#include
void main()
{
seqlist *l = create_list();
if (l == NULL)
printf("create list failed\n");
insert_list(l, 0, 2);
insert_list(l, 1, 3);
insert_list(l, 2, 5);
insert_list(l, 3, 7);
insert_list(l, 4, 9);
printf_list(l);
insert_list(l, 2, 13);
printf_list(l);
delte_list(l,2);
printf_list(l);
change_list(l,3,666);
printf_list(l);
select_list(l,3);
printf_list(l);
}

