1. 程式人生 > >資料結構第二章線性表---課本程式碼

資料結構第二章線性表---課本程式碼

1.線性表的順序儲存

#include<iostream>

using namespace std;
typedef int ElemType;
typedef int Status;

//線性表的定義
typedef struct{
    int n;      //  統計順序表真實的容量
    int maxLength;  //統計最大容量
    ElemType *element; //順序表的首地址
}SeqList;

//初始化
Status Init(SeqList *L,int mSize){
    L->n=0;
    L->maxLength=mSize;
    L->element=(ElemType *)malloc
(sizeof(ElemType)*mSize); //動態生成一維陣列空間 if(!L->element) return 0; return 1; } //查詢ai的值(下標為i的數) Status Find(SeqList L,int i,ElemType *x){ if(i<0||i>L.n-1) return 0; *x=L.element[i]; //通過x返回待查詢的值 return 1; } //插入,插入的位置是i+1,插入x Status Insert(SeqList *L,int i,ElemType x){ if
(i<-1||i>L->n-1) //下標越界 return 0; if(L->n==L->maxLength) //線性表滿 return 0; for(int j=L->n-1;j>i;j--) L->element[j+1]=L->element[j]; L->element[i+1]=x; L->n=L->n+1; return 1; } //刪除,將元素ai刪除 Status Delete(SeqList *L,int i){ if
(i<0||i>L->n-1) return 0; if(!L->n) //防止空表 return 0; for(int j=i+1;j<=L->n;j++) L->element[j-1]=L->element[j]; L->n--; return 1; } //輸出 Status Output(SeqList L){ if(!L.n) return 0; for(int j=0;j<=L.n-1;j++) cout<<L.element[j]<<" "; cout<<endl; return 1; } //撤銷運算 void Destroy(SeqList *L){ L->maxLength=0; L->n=0; free(L->element); } int main(){ int i; SeqList list; Init(&list,10); for(i=0;i<9;i++) Insert(&list,i-1,i); //在位置ai+1處進行插入i Output(list); Delete(&list,0); Output(list); Destroy(&list); return 0; }

2.線性表的鏈式儲存

#include<iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
//定義每個結點,資料域和指標域
typedef struct node{
    ElemType element;
    struct node *link;
}node;

//定義單鏈表
typedef struct{
    node *first;  //頭指標,只向單鏈表的首地址
    int n;          // 連結串列的真實長度
}SingleList;

//初始化
Status Init(SingleList *L){
    L->n=0;
    L->first=NULL;
    return 1;
}

//查詢,查詢ai
Status Find(SingleList L,int i,ElemType *x){
    node *p;
    if(i<0||i>L.n-1)
        return 0;

    p=L.first;
    for(int j=0;j<i;j++)
        p=p->link;
    *x=p->element;      //  通過x返回找到的值
    return 1;
}

//插入,插入的位置i+1,插入的數x
Status Insert(SingleList *L,int i,ElemType x){
    node *p,*q;
    if(i<-1||i>L->n-1)
        return 0;
    p=L->first;
    for(int j=0;j<i;j++) p=p->link;     //p是帶插入結點的前驅結點,p指向ai
    q=(node *)malloc(sizeof(node ));    //生成結點q
    q->element=x;

    if(i>-1){                   //插入的不是頭結點
        q->link=p->link;
        p->link=q;
    }
    else{
        q->link=L->first;       //新結點插在頭結點前,成為新的頭結點
        L->first=q;
    }
    L->n++;
    return 1;
}

//單鏈表的刪除,刪除元素ai
Status Delete(SingleList *L,int i){
    node *p,*q;
    if(!L->n)
        return 0;
    if(i<0||i>L->n-1)
        return 0;

    p=L->first;
    q=L->first;
    for(int j=0;j<i-1;j++)
        q=q->link;        //q是待刪結點的前驅結點

    if(i==0){              //待刪除的是頭結點
        L->first=L->first->link;
    }
    else{
        p=q->link;      //p是待刪結點
        q->link=p->link;
    }
    free(p);    //  釋放p的儲存空間
    L->n--;
    return 1;
}

//單鏈表的輸出
Status Output(SingleList L){
    node *p;
    if(!L.n)
        return 0;
    p=L.first;
    while(p){
        cout<<p->element<<" ";
        p=p->link;
    }
    cout<<endl;
    return 1;
}

//單鏈表的撤銷,從頭到尾一個一個的撤銷
Status Destory(SingleList *L){
    node *p;        //p用來儲存刪除當前頭結點後的頭結點的位置,避免造成斷鏈
    while(L->first){
        p=L->first->link;
        free(L->first);
        L->first=p;
    }
    return 1;
}

int main(){
    int i,x;
    SingleList list;
    Init(&list);
    for(i=0;i<9;i++)
        Insert(&list,i-1,i);
    cout<<"The linklist is: "<<endl;
    Output(list);
    Delete(&list,0);
    cout<<"The linklist is: "<<endl;
    Output(list);
    Find(list,0,&x);
    cout<<"The value is: "<<endl;
    cout<<x<<endl;
    Destory(&list);
    return 0;
}

3.帶表頭的雙鏈表
寫代表頭的雙鏈表的時候,寫到撤銷那裡錯了,後面修改。

/*帶表頭的單鏈表
先前處理單鏈表,由於頭結點沒有直接前驅,所以需要作為特殊情況單獨處理,
為了簡化演算法,我們在頭結點前加一個表頭結點*/
#include<iostream>
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct node{
    ElemType element; //資料域
    struct node *link; //指標域
}node;

typedef struct{
    struct node *head;
    int n;      //連結串列的真實長度
}HeaderList;

//初始化構造一個僅帶有一個表頭結點的空的單鏈表
Status Init(HeaderList *list){
    list->head=(node *)malloc(sizeof(node));
    if(!list->head)
        return 0;
    list->n=0;
    list->head->link=NULL;
    return 1;
}

//插入操作,在ai+1的位置插入x
Status Insert(HeaderList *list,int i,ElemType x){
    if(i<-1||i>list->n-1){
        return 0;
    }
    node *p,*q;
    p=list->head;
    for(int j=0;j<=i;j++) p=p->link;

    q=(node *)malloc(sizeof(node));
    q->element=x;
    q->link=p->link;
    //p是帶插入位置的前驅結點,q是帶插入的位置
    p->link=q;
    list->n++;
    return 1;
}

//刪除操作,刪除ai.p是待刪結點的前驅結點,q是待刪結點
Status Delete(HeaderList *list,int i){
    node *p,*q;
    if(!list->n)
        return 0;
    if(i<0||i>list->n-1)
        return 0;

    p=list->head;
    for(int j=0;j<i;j++) p=p->link;
    q=p->link;
    p->link=q->link;
    free(q);
    list->n--;
    return 1;
}

//輸出
Status Output(HeaderList list){
    node *p;
    p=list.head->link;
    while(p){
        cout<<p->element;
        p=p->link;
    }
    cout<<endl;
    return 1;
}

//查詢ai,通過x返回該值
Status Find(HeaderList list,int i,ElemType *x){
    if(i<0||i>list.n-1)
        return 0;
    node *p;
    p=list.head;
    for(int j=0;j<=i;j++) p=p->link;
    *x=p->element;
    return 1;
}

////撤銷操作,從頭到尾
//Status Destroy(HeaderList *list){
//    node *p=list->head;
//    while(p){
//        p=list->head->link;
//        free(list->head);
//        list->head=p;
//    }
//    return 1;
//}

int main(){
    int i,x;
    HeaderList list;
    Init(&list);
    for(i=0;i<9;i++){
        Insert(&list,i-1,i);
    }
    cout<<"the headlist is:";

    Output(list);
    Delete(&list,0);
    cout<<"the headlist is:";
    Output(list);

    Find(list,0,&x);
    cout<<"the value is:";
    cout<<x<<endl;

//    Destroy(&list);
    return 0;
}