1.線性表?
概念:
一個(gè)線性表是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列,線性表中數(shù)據(jù)元素之間的關(guān)系是一對(duì)一的關(guān)系贴浙。
特點(diǎn):
①有且只有一個(gè)元素沒有前驅(qū)元素---首元素/頭元素
②有且只有一個(gè)元素沒有后繼元素--尾元素
線性表存儲(chǔ):
連續(xù)式存儲(chǔ):用連續(xù)的存儲(chǔ)單元存儲(chǔ)順序表(數(shù)組形式)
不連續(xù)性:用不連續(xù)的存儲(chǔ)單元存儲(chǔ)不連續(xù)的鏈表(鏈?zhǔn)酱鎯?chǔ))
2.順序表
概念:
用連續(xù)的存儲(chǔ)單元存儲(chǔ)一個(gè)線性表
特點(diǎn):
①連續(xù)的存儲(chǔ)單元---采用數(shù)組形式
②不改變線性表數(shù)據(jù)元素的邏輯次序
優(yōu)點(diǎn):
①不改變邏輯存儲(chǔ)順序
②地址連續(xù)(連續(xù)存儲(chǔ))崎溃,可以通過計(jì)算得到任意地址袁串,訪存速度快,可以實(shí)現(xiàn)隨機(jī)訪問
③要素:首元素地址赎瑰、單元偏移(下標(biāo))
缺點(diǎn):
①要占據(jù)大塊的連續(xù)空間
②插入刪除不方便
3.分配數(shù)組
形式:
定義數(shù)組:數(shù)據(jù)類型 數(shù)組名[元素個(gè)數(shù)]
(從高址向低址找破镰,以每個(gè)數(shù)據(jù)類型占據(jù)的字節(jié)數(shù)為一個(gè)偏移單位計(jì)算鲜漩,元素個(gè)數(shù)只能是常量)
int和float均為4字節(jié)數(shù)據(jù)類型
②動(dòng)態(tài)分配地址:
malloc(元素個(gè)數(shù)*sizeof(數(shù)據(jù)類型));
返回的地址類型不對(duì)是void型的,應(yīng)該進(jìn)行強(qiáng)制類型轉(zhuǎn)換
int*p;p = (數(shù)據(jù)類型*)malloc(元素個(gè)數(shù)*sizeof(數(shù)據(jù)類型));
注意:指針a指向數(shù)組首元素不動(dòng)
??sizeof里面的數(shù)據(jù)類型是單元類型,強(qiáng)制類型轉(zhuǎn)換的數(shù)據(jù)類型后面加了*是單元的地址類型
練習(xí):定義一塊有8個(gè)元素的整形數(shù)組踩娘,并輸入數(shù)據(jù)喉祭,通過函數(shù)AvgArray(int *a)返回?cái)?shù)組的平均值
(定義數(shù)組可以初始化給值,malloc動(dòng)態(tài)分配內(nèi)存的數(shù)組只能scanf手動(dòng)輸入)
#include<stdio.h> #include<stdlib.h> int main(){ int *a;//定義指針 //分配動(dòng)態(tài)數(shù)組 a = (int *)malloc(8*sizeof(int)); int i; for(i=0;i<8;++i){ scanf("%d",a+i); } double AvgArray(int *a,int n){ double result=0.0; for(i=0;i<n;i++){ result += a[i]; } return result/n; } printf("%f\n",AvgArray(a,8)); }
實(shí)現(xiàn):
1.順序表的查找(順序查找)
例:設(shè)有順序表Data(無序习寸、無重復(fù)值)傻工,給定關(guān)鍵字key中捆,在順序表中查找關(guān)鍵字key的數(shù)據(jù)元素,若找到返回下標(biāo)殴蓬,未找到則返回-1
#include<stdio.h>#include<stdlib.h> intFindElem(int*a,intn,intkey){// int i,n=-1;// for(i=0;i<n;i++){// if(a[i] == key){// n = i;// break;// }// }// return n;// int i;// for(i=0;i<n;){// if(a[i]==key) break;// else i++;// }// if(i<n) return i;// else return -1;// int i;// for(i=0;i<n;i++){// if(a[i]==key) break;// }// if(i<n) return i;// else return -1;// int i;// for(i=0;i<n;i++){// if(a[i]==key) break;// }// return i<n?i:-1;inti;for(i=0;i-1)printf("Yes!\n");elseprintf("No!\n");printf("%d\n",R);return0;}
2.順序表的刪除
例:將順序表中給定的關(guān)鍵字key的對(duì)應(yīng)的數(shù)據(jù)元素從順序表中刪除
#include<stdio.h>#include<stdlib.h>int DelKeyElem(int a[],int n,int key){int i,j;for(i=0;i<n&&a[i]!=key;++i);if(i<n){for(j=i;j<n-1;++j){ a[j]=a[j+1]; } n--; } return n; } int main(void){ int Data[8]={2,5,7,8,4,9,10}; int key,n,i; printf("請輸入一個(gè)數(shù)字key:"); scanf("%d",&key); int DelKeyElem(int *a,int n,int key); n = DelKeyElem(Data,7,key); for(i=0;i<n;i++){ printf("%3d",Data[i]); } //free*Data; return 0; }
C語言種輸出形式:
%c:單個(gè)字符
%x:十六進(jìn)制整數(shù)
%d:十進(jìn)制整數(shù)
%f :十進(jìn)制浮點(diǎn)數(shù)
%o:八進(jìn)制數(shù)
%s :字符串
%u:無符號(hào)十進(jìn)制數(shù)
%%:輸出百分號(hào)%