DS 線性表2:建設“單鏈表”算法庫

任務和代碼:

main.cpp
/*  
*All rights reserved  
*文件名稱:main.c  
*作者: Osseyda  
完成日期:2018.5.9 
*版本號:v2.  
*  
*問題描述:單鏈表的應用 
*問題輸出:程序的多文件組織形式 
*/    
#include <stdio.h>
#include "list.h"

int main(){
    LinkList *Li, *Li1, *Li2;
    InitList(Li);
    ElemType x[7]= {5,8,7,2,5,4,9};
    ElemType e1, e2;
    /*首插法創建單鏈表*/
    CreateListH(Li, x, 7);
    printf("首插法創建單鏈表: ");
    DispList(Li);
    printf("\n");
    /*尾插法創建單鏈表*/
    CreateListT2(Li, x, 7);
    printf("尾插法創建單鏈表: ");
    DispList(Li);
    printf("\n");
    /*判斷該鏈表是否爲空,不爲空則打印長度*/
    if(ListEmpty(Li))
        printf("該鏈表爲空");
    else
        printf("該鏈表不爲空且長爲%d",ListLength(Li));
    printf("\n\n");
    /*讀指定位置的元素值並打印*/
    if(GetElem(Li,4,e1))
        printf("4號位置對應的元素: %d",e1);
    else
        printf("位置不在鏈表長度之內");
    printf("\n\n");
    /*讀指定元素位置並打印*/
    if(LocateElem(Li,11))
        printf("元素值11對應的位置爲: %d",LocateElem(Li,11));
    else
        printf("元素值11對應元素不在此鏈表內");
    printf("\n\n");
    /*指定位置插入元素並打印新的鏈表*/
    ListInsert(Li,2,3);
    printf("在第2個元素位置添加元素3:");
    DispList(Li);
    printf("\n");
    /*刪除指定位置的元素並打印新的鏈表*/
    ListDelete(Li,5,e2);
    printf("刪除5號位置元素%d後的新鏈表:",e2);
    DispList(Li);
    printf("\n");
    /*刪除元素最大的結點後的新鏈表*/
    delmaxnode(Li);
    printf("刪除元素最大的結點後的新鏈表:");
    DispList(Li);
    printf("\n");
    /*增序排列結點後的新鏈表*/
    sortUp(Li);
    printf("增序排列結點後的新鏈表:");
    DispList(Li);
    printf("\n");
    /*拆分單鏈表,奇數位和偶數位上的元素各自形成鏈表*/
    printf("L->L1,L2\n");
    split(Li, Li1, Li2);
    printf("子鏈表L1: ");
    DispList(Li1);
    printf("子鏈表L2: ");
    DispList(Li2);
    printf("\n");
    return 0;
}
list.h
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
typedef char ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LinkList;
void InitList(LinkList *&L);
bool ListEmpty(LinkList *L);
void CreateListH(LinkList *&L, ElemType a[], int n);
void CreateListT1(LinkList *&L, ElemType a[], int n);
void CreateListT2(LinkList *&L, ElemType a[], int n);
void DestoryList(LinkList *&L);
int ListLength(LinkList *L);
void DispList(LinkList *L);
bool GetElem(LinkList *L, int i, ElemType &e);
int LocateElem(LinkList *L, ElemType e);
bool ListInsert(LinkList *&L, int i, ElemType e);
bool ListDelete(LinkList *&L, int i, ElemType &e);
void split(LinkList *&L, LinkList *&L1, LinkList *&L2);
void delmaxnode(LinkList *&L);
void sortUp(LinkList *&L);
#endif // LIST_H_INCLUDED
list.cpp
#include <stdio.h>
#include "list.h"
#include <malloc.h>

//1.初始化線性表
void InitList(LinkList *&L){
    L=(LinkList *)malloc(sizeof(LinkList));
    L->next=NULL;
}

//2.判斷線性表是否爲空表
bool ListEmpty(LinkList *L){
    return (L->next==NULL);
}

//3.在新結點與首結點間不斷插入新結點,
void CreateListH(LinkList *&L, ElemType a[], int n){
    LinkList *s;
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));
    L->next=NULL;
    for(i=0; i<n; i++){
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=a[i];
        s->next=L->next;
        L->next=s;     //L->next是跟隨結點
    }
}

//4.在新插入的結點之後繼續插入結點
void CreateListT1(LinkList *&L, ElemType a[], int n){
    LinkList *s, *r; //把r看成結點增量
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));
    r=L;
    for(i=0; i<n; i++){
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}

//5.在新插入的結點與NULL之間不斷插入新結點
void CreateListT2(LinkList *&L, ElemType a[], int n){
    LinkList *s, *r;    //r是跟隨結點
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));
    r=L;
    for(i=0; i<n; i++){
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=a[i];
        s->next=NULL;
        r->next=s;
        r=s;
    }
}

//6.銷燬線性鏈表
void DestoryList(LinkList *&L){
    LinkList *pre=L, *p=L->next;
    while (p!=NULL){
        free(pre);
        pre=p;       //pre是追隨結點
        p=p->next;
    }
    free(pre);
}

//7.求線性表的長度
int ListLength(LinkList *L){
    int n=0;
    LinkList *p=L->next;
    while(p!=NULL){
        n++;
        p=p->next;
    }
    return n;
}

//8.輸出線性表
void DispList(LinkList *L){
    LinkList *p=L->next;
    while(p!=NULL){
        printf("%d ", p->data);
        p=p->next;
    }
    printf("\n");
}

//9.求線性表指定位置的某個元素
bool GetElem(LinkList *L, int i, ElemType &e){
    LinkList *p=L;
    int j=0;
    while(j<i && p!=NULL){
        j++;
        p=p->next;
    }
    if(p==NULL)
        return false;
    else{
        e=p->data;
        return true;
    }
}

//10.按元素值查找在線性表中的位置
int LocateElem(LinkList *L, ElemType e){
    int i=1;
    LinkList *p=L->next;
    while(p!=NULL && p->data!=e){
        p=p->next;
        i++;
    }
    if(p==NULL)
        return 0;
    else
        return i;
}

//11.插入數據元素
bool ListInsert(LinkList *&L, int i, ElemType e){
    LinkList *q=L, *s;
    int j=0;
    while(j<i-1 && q!=NULL){
        j++;
        q=q->next;
    }
    if(j==i-1){
        if(q==NULL)
            return false;
        else{
            s=(LinkList *)malloc(sizeof(LinkList));
            s->data=e;
            s->next=q->next;
            q->next=s;
        }
        return true;
    }
    else
        return false;
}

//12.刪除數據元素
bool ListDelete(LinkList *&L, int i, ElemType &e){
    LinkList *q=L, *p=L->next;
    int j=1;
    while(j<i && p!=NULL){
        j++;
        q=p;
        p=p->next;
    }
    if(i==j){
        if(p==NULL)
            return false;
        else{
            e=p->data;
            q->next=p->next;
            free(p);
            return true;
        }
    }
    else
        return false;
}

//13.拆分單鏈表
void split(LinkList *&L, LinkList *&L1, LinkList *&L2){
    LinkList *p=L->next, *q, *r1;
    L1=L;
    r1=L1;
    L2=(LinkList *)malloc(sizeof(LinkList));
    L2->next=NULL;
    while(p!=NULL){
        r1->next=p;
        r1=p;             //r1是p的跟隨結點
        p=p->next;
        if(p!=NULL){   //防止出現奇數個元素時,q出現野指針的情況
            q=p->next;
            p->next=L2->next;
            L2->next=p;
            p=q;              //q是p的領跑結點
        }
    }
    r1->next=NULL;
}

//14.刪除最大元素節點
void delmaxnode(LinkList *&L){
    LinkList *p=L->next, *pre=L, *maxp=p, *maxpre=pre;
    while(p!=NULL){
        if(maxp->data < p->data){
            maxp=p;
            maxpre=pre;  //pre的作用
        }
        pre=p;
        p=p->next;   //pre是p的跟隨結點
    }
    maxpre->next=maxp->next;
    free(maxp);
}

//15.增序排列結點
void sortUp(LinkList *&L){
    LinkList *p, *pre, *q;   //pre是p的前一個結點
    p=L->next->next;
    L->next->next=NULL;
    while(p!=NULL){
        q=p->next;           //在p->next未變化之前先定下p的領跑結點
        pre=L;
        while(pre->next!=NULL && pre->next->data<p->data)
            pre=pre->next;   //找到pre
        p->next=pre->next;
        pre->next=p;
        p=q;                 //若p=p->next則進入死循環
    }
}

Result:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章