演算法學習之旅-線性表及其實現
阿新 • • 發佈:2018-12-10
目錄
1、順序儲存實現(陣列)
1.1、定義
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List Ptrl;
1.2、注意操作的實現
(1)初始化(建立空的順序表)
List MakeEmpty() { List Ptrl; Ptrl = (List)malloc(sizeof(struct LNode); Ptrl->Last = -1; return Ptrl; }
(2)查詢 (X)
int Find (ElementType X, List Ptrl)
{
int i = 0;
while(i <=Ptrl->Last && Ptrl->Data[i]!=X)
i++;
if(i > Ptrl->Last) return -1;//如果沒找到,返回-1
else return i;
}
(3)插入 (在第i(1<=i<=n+1)個位置上插入一個值為X的新元素)
實現:
void Insert(ElementType X, int i,List Ptrl) { int j; if (Ptrl->Last == MAXSIZE-1) { printf("表已滿,不能插入"); return ; } if (i <1 || i > Ptrl->Last+2) { printf("位置不合法"); return ; } for (j = Ptrl->Last;j >=i-1;i++) Ptrl->Data[j+1] = Ptrl->Data[j];//將a[j]後面的元素依次向後移動 Ptrl->Data[i+1] = X;//新元素插入 Ptrl->Last++; return ; }
(4)刪除(在第i(1<=i<=n+1)個位置上刪除一個值為X的新元素)
實現:
void Delete(int i,List Ptrl)
{
int j;
if(i < 1 || i > Ptrl->Last+1) {
printf("不存在第%d個元素",i);
}
for (j=i;j<=Ptrl->Last;j++)
Ptrl->Data[j-1] = Ptrl->Data[j];
Ptrl->Last--;
return ;
}
2、鏈式儲存(連結串列)
2.1、定義:
typedef struct LNode *List;
struct LNode {
ElementType Data;//資料域
List Next;//指標域,即下一個結點的位置
};
struct LNode L;
List Ptrl;
2.2、實現操作
(1)求表長
int Length(List Ptrl) {
List p = Ptrl;//p指向表的第一個結點
int j = 0;
while (p) {
P = P->Next;
j++;//當前p指向的是第j個結點
}
return j;
}
(2)查詢
a、按序號查詢:FindKth;
List FindKth(int K,List Ptrl) {
List p = Ptrl;
int i = 1;
while (p!=NULL && i<K) {
p= p->Next;
i++;
}
if( i==k) return p;
else
return NULL;
}
b、按值查詢:Find
List Find(ElementType X,List Ptrl) {
List p = Ptrl;
while (p!=NUll && p->Data !=X)
p = p->Next;
return p;
}
(3)插入(在第i-1(1<=i<=n+1)個結點後插入一個值為X的新結點
實現:
List Insert(ElementType X, int i, List Ptrl) {
List p,s;
if (i==1) { //新結點插入在表頭
s = (List)malloc(sizeof(struct LNode)); //申請空間,填裝結點
s->Data = X;
s->Next = Ptrl;
return s; //返回新表頭指標
}
p = FindKth(i-1,Ptrl); //查詢第i-1個結點
if (p == NULL) { //第i-1個不存在,不能插入
printf("引數i錯");
return NULL;
}else {
s = (List)malloc(sizeof(struct LNode));//申請空間,填裝結點
s->Data = X;
s->Next = p->Next; //新結點插入在第i-1個結點的後面
p->Next = s;
return Ptrl;
}
}
(4)刪除(刪除連結串列的第i(1<=i<=n)個位置上的結點)
實現:
List Delete(int i,List Ptrl) {
List p,s;
if (i ==1) { //若要刪除的是表的第一個結點
s= Ptrl; //s指向第1個結點
if (Ptrl!=NULL)
Ptrl = Ptrl->Next; //從連結串列中刪除
else
return NULL;
free(s); //釋放被刪除結點
return Ptrl;
}
p = FindKth(i-1,Ptrl); //查詢第i-1個結點
if (p == NULL) {
printf("第%d個結點不存在",i-1);
} else if (p->Next == NULL) {
printf("第%d個結點不存在",i);
} else {
s= p->Next; //s指向第i個結點
p->Next = s->Next; //從連結串列中刪除
free(s); // 釋放被刪除結點
return Ptrl;
}