線性表
學習
不想學習
還是學習吧!!!
早起很痛苦!!!
學習不能使人快樂!!!
線性表內容還是算少的!!兩天整理完了!!!
一.線性表
1.線性表的順序存儲
typedef struct{
ElemType data[MaxSize];//順序表的元素
int length;//順序表的當前長度
}SqList;//順序表的類型定義
#define InitSize 100 //表長度的初始定義
typedef struct{
ElemType *data;//指示動態分配數組的指針
int MaxSize,length;//數組的最大容量和當前個數
}SeqList;//動態分配數組順序表的類型定義
2.插入操作(在第i(1<=i<=L.length+1)個位置插入新元素e
bool ListInsert(SqList &L,int i,ElemType e)
{
//將元素e插入到順序表L中第i個位置
if(i<1 || i>L.length+1) //判斷i的範圍是否有效
return false;
if(L.length>=MaxSize) //當前存儲空間已滿,不能插入
return false;
for(int j=L.length;j>=i;j--) //將第i個元素及以後的元素後移
L.data[j]=L.data[j-1];
L.data[i-1]=e;//在位置i處放入e
L.length++;
return true;
}
3.刪除操作(刪除順序表中第i(1<=i<=L.length+1)個位置的元素
bool ListDelete(SqList &L,int i,Elemtype &e)
{
//實現刪除順序表L中第i個位置的元素
if(i<1 || i>L.length) //判斷i的範圍是否有效
return false;
e=L.data[i-1];//被刪除的元素複製給e
for(int j=0;j<L.length;j++) //將第i個位置後的元素前移
L.data[j-1]=L.data[j];
L.length--;//線性表長度減1
return true;
}
4.按值查找
int LocateElem(SqList L,ElemType e)
{
//查找順序表中值爲e的元素,查找成功,返回位序
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i-1;//下標爲i的元素值等於e,返回其位序i+1
return 0;
}
二.單鏈表
1.單鏈表中結點類型
typedef struct LNode{ //定義單鏈表結點類型
ElemType data;//數據域
struct LNode *next;//指針域
}LNode,*LinkList;
2.建立單鏈表
//頭插法建立單鏈表(讀入的數據的順序與生成的鏈表中的元素的順序是相反的)
//每個結點插入的時間爲O(1),設單鏈表長爲n,則總時間複雜度爲O(n)
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;int x;//創建頭結點
L=(LinkList)malloc(sizeof(LNode));//創建頭結點
L->next=NULL;//初始爲空鏈表
scanf("%d",&x);//輸入結點的值
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));//創建新結點
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);//將新結點插入表中,L爲頭指針
}
return L;
}
//尾插法,將新結點插入到當前鏈表的表尾,增加一個尾指針,使其始終指向當前鏈表的尾結點
LinkList List_TailInsert(LinkList &L)
{
//從表頭到表尾正向建立單鏈表L,每次均在表尾插入元素
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;//r爲表尾指針
scanf("%d",&x);//輸入結點的值
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;//r指向新的表尾結點
scanf("%d",&x);
}
r->next=NULL;//尾結點指針置空
return L;
}
3.按序號查找結點值
LNode *GetElem(LinkList L,int i){
//取出單鏈表L(帶頭結點)中第i個位置的結點指針
int j=1;//計數,初始爲1
LNode *p=L->next;//頭結點指針賦給p
if(i==0)
return L;//若i等於0,則返回頭結點
if(i<1)
return NULL;//若i無效,則返回NULL
while(p&&j<i)
{
//從第1個結點開始找,查找第i個結點
p=p->next;
j++;
}
return p;//返回第i個結點的指針,如果i大於表長,p=NULL,直接返回p即可
}
4.按值查找表結點
LNode *LocateElem(LinkList L,ElemType e)
{
//查找單鏈表L(帶頭結點)中數據域值等於e的結點指針,否則返回NULL
LNode *p=L->next;
while(p!=NULL&&p->data!=e) //從第一個結點開始查找data域爲e的結點
p=p->next;
return p;
}