1. 程式人生 > >演算法學習之旅-線性表及其實現

演算法學習之旅-線性表及其實現

目錄

(2)查詢

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;    
}

3、擴充套件 -- 廣義表

3.1、定義

3.2、概念注意點