1. 程式人生 > >資料結構實驗1— 線性表、連結串列的實現

資料結構實驗1— 線性表、連結串列的實現

實現順序表各種基本操作

實驗要求

編寫程式實現順序表的各種基本運算,並在此基礎上設計一個主程式完成如下功能:

(1)初始化順序表L;
(2)依次在L尾部插入元素-1,21,13,24,8;
(3)輸出順序表L;
(4)輸出順序表L長度;
(5)判斷順序表L是否為空;
(6)輸出順序表L的第3個元素;
(7)輸出元素24的位置;
(8)在L的第4個元素前插入元素0;
(9)輸出順序表L;
(10)刪除L的第5個元素;
(11)輸出順序表L。

程式程式碼

#include <cstdio>
#include <cstring> #include <algorithm> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType; typedef int Status; typedef int Boolean; const int l = 40
; typedef struct{ ElemType * elem; int length; int listsize; }SqList,*pSqList; Status compare(ElemType a, ElemType b) { if(a<b) return TRUE; else return FALSE; } Status InitList_Sq(pSqList L) { L->elem = (ElemType *) malloc(LIST_INIT_SIZE *sizeof(ElemType)); if(!L->elem) exit
(OVERFLOW); L->length = 0; L->listsize = LIST_INIT_SIZE; return OK; } Status ListInsert_Sq(pSqList L, int i, ElemType e) { if(i<1 || i>L->length+1) return ERROR; if(L->length >= L->listsize){ ElemType * newbase = (ElemType *) realloc(L->elem,(L->listsize+LISTINCREMENT) * sizeof(ElemType)); if(!newbase) exit(OVERFLOW); L->elem = newbase; L->listsize +=LISTINCREMENT; } ElemType * q = &(L->elem[i-1]); for(ElemType * p = &(L->elem[L->length-1]);p>=q;--p) *(p+1) = *p; *q = e; ++L->length; return OK; } Status ListDelete_Sq(pSqList L, int i, ElemType * e) { if((i<1) || (i> L->length)) return ERROR; ElemType * p = &(L->elem[i-1]); *e = *p; ElemType *q = L->elem + L->length - 1; for(++p; p<=q; ++p) *(p-1) = *p; --L->length; return OK; } Status LocateElem_Sq(pSqList L, ElemType e) { int i = 1; ElemType * p = L->elem; while(i<= L->length && *p++ != e)++i; if(i<=L->length) return i; else return 0; } Status ListTreverse_Sq( pSqList L) { ElemType * p = L->elem; ElemType * q = L->elem + L->length -1; bool first = true; for(;p<=q;++p){ if(first){printf("%d",*p); first = false;} else printf(" %d",*p); } printf("\n"); return OK; } Status ListIsEmpty_Sq(pSqList L) { if(L->length == 0) return TRUE; else return FALSE; } Status ListLocatePrint_Sq(pSqList L, int i) { if(i<1 || i>=L->length+1) return ERROR; else printf("The %d number is %d\n",i,*(L->elem+(i-1))); return OK; } Status Paint() { printf("|"); printf(" The Experiment Of LinkList ") ;printf("|\n"); printf("|"); printf(" Sequential LinkList ") ;printf("|\n"); printf("|"); printf(" Author: Luo Peng Fei ") ;printf("|\n"); printf("|"); printf(" Date:2017/3/29 ") ;printf("|\n"); return OK; } int main() { Paint(); SqList L; InitList_Sq(&L); int n,pos,temp; printf("|"); printf(" 請輸入數字的數量 ") ;printf("|\n"); scanf("%d",&n); printf("|"); printf(" 請依次輸入%d個數字 ",n) ;printf("|\n"); for(int i = 0; i<n; ++i){ int t; scanf("%d",&t); ListInsert_Sq(&L,L.length+1,t); } printf("|"); printf(" 當前連結串列的內容是 ") ;printf("|\n"); ListTreverse_Sq(&L); printf("當前連結串列%s\n",ListIsEmpty_Sq(&L)?"空":"不空"); printf("|"); printf(" 當前連結串列的長度是%d ",L.length) ;printf("|\n"); printf("|"); printf(" 您想查詢當前連結串列哪個位置的元素 ") ;printf("|\n"); scanf("%d",&n); if(!ListLocatePrint_Sq(&L,n)) printf("抱歉位置錯誤\n"); printf("|"); printf(" 請輸入您想要查詢位置的元素值 ") ;printf("|\n"); scanf("%d",&n); pos = LocateElem_Sq(&L,n); printf("|"); printf(" %d在連結串列中的位置是%d ",n,pos) ;printf("|\n"); printf("|"); printf(" 請分別輸入要插入元素的值和位置 ") ;printf("|\n"); scanf("%d%d",&pos,&n); ListInsert_Sq(&L,pos,n); printf("|"); printf(" 當前連結串列的內容是 ") ;printf("|\n"); ListTreverse_Sq(&L); printf("|"); printf(" 請輸入刪除元素的位置 ") ;printf("|\n"); scanf("%d",&n); if(!ListDelete_Sq(&L,n,&temp)) printf("抱歉位置錯誤!\n"); printf("|"); printf(" 當前連結串列的內容是 ") ;printf("|\n"); ListTreverse_Sq(&L); return 0; }

執行結果

這裡寫圖片描述

實現單鏈表各種基本操作

實驗要求

編寫程式實現單鏈表的各種基本運算,並在此基礎上設計一個主程式完成如下功能:
(1)初始化單鏈表h;
(2)依次採用頭插法插入元素-1,21,13,24,8;
(3)輸出單鏈表h;
(4)輸出單鏈表h長度;
(5)判斷單鏈表h是否為空;
(6)輸出單鏈表h的第3個元素;
(7)輸出元素24的位置;
(8)在h的第4個元素前插入元素0;
(9)輸出單鏈表h;
(10)刪除h的第5個元素;
(11)輸出單鏈表h。

程式程式碼

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int Status;
typedef int Boolean;
typedef struct LNode{
    ElemType data;
    struct LNode * next;
}LNode, *LinkList;
const int l = 40;
Status ListIsEmpty_L(LinkList L)
{
    if(L->next == NULL) return FALSE;
    else return TRUE;
}
Status GetElem_L(LinkList L, int i, ElemType *e)
{
    LinkList p = L->next; int j = 1;
    while(p && j<i){
        p = p->next; ++j;
    }
    if(!p || j>i) return ERROR;
    *e = p->data;
    return OK;
}
Status ListInsert_L( LinkList  L, int i, ElemType e)
{
    LinkList p = L; int j = 0;
    while(p && j<i-1){
        p = p->next; ++j;
    }
    if(!p || j>i-1) return ERROR;
    LinkList s= (LinkList) malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}
Status ListDelete_L(LinkList  L, int i, ElemType * e)
{
    LinkList p = L; int j = 0;
    while(p->next && j< i-1){
        p = p->next; ++j;
    }
    if(!(p->next) || j>i-1) return ERROR;
    LinkList q = p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return OK;
}
void CreatList_L(LinkList &L , int n)
{
    L = (LinkList) malloc(sizeof(LNode));
    L->next = NULL;
    for(int i = 0; i<n; ++i){
        LinkList p = (LinkList) malloc(sizeof(LNode));
        int t;
        scanf("%d",&t);
        p->data = t;
        p->next = L->next;
        L->next = p;
    }
}
Status ListTreverse_L(LinkList L)
{
    if(L->next == NULL) return ERROR;
    else{
        LinkList p = L->next;
        bool first = true;
        while(p){
            if(first){
                printf("%d",p->data);
                first = false;
            }else{
                printf(" %d",p->data);
            }
            p = p->next;
        }
        printf("\n");
    }
    return OK;
}
Status ListLenth(LinkList L,int * length )
{
    if(!L->next) *length = 0;
    else{
        LinkList p = L->next; int j = 0;
        while(p){
            j++;
            p = p->next;
        }
        * length = j;
    }
    return OK;
}
Status ListLocate(LinkList L, int n,int *e)
{
    if(!L->next) *e = 0;
    else{
        LinkList p = L->next;
        int j = 1;
        while(p->data != n){
            p = p->next;
            ++j;
        }
        int lenth  = ListLenth(L,&lenth);
        if(j>=lenth && !p) return ERROR;
        *e = j;
    }
    return OK;
}
Status Paint()
{
    printf("|"); printf("     The Experiment Of LinkList      ") ;printf("|\n");
    printf("|"); printf("         Pointer   LinkList          ") ;printf("|\n");
    printf("|"); printf("        Author: Luo Peng Fei         ") ;printf("|\n");
    printf("|"); printf("           Date:2017/3/29            ") ;printf("|\n");
    return OK;
}
int main()
{
    Paint();
    LinkList L = NULL ;
    int n,length,temp,pos;
    printf("|"); printf("         請輸入數字的數量            ") ;printf("|\n");
scanf("%d",&n);
printf("|"); printf("        請依次輸入%d個數字            ",n) ;printf("|\n");
    CreatList_L(L,n);
    printf("|"); printf("         當前連結串列的內容是            ") ;printf("|\n");
    ListTreverse_L(L);
    printf("當前連結串列%s\n",ListIsEmpty_L(L)?"不空":"空");
    ListLenth(L,&length);
    printf("|"); printf("         當前連結串列的長度是%d           ",length) ;printf("|\n");
    printf("|"); printf("   您想查詢當前連結串列哪個位置的元素    ") ;printf("|\n");
    scanf("%d",&n);
    if(!GetElem_L(L,n,&temp)) printf("抱歉位置錯誤\n");
    else {printf("|"); printf("         %d在連結串列中的位置是%d          ",temp,n) ;printf("|\n");}
    printf("|"); printf("    請輸入您想要查詢位置的元素值     ") ;printf("|\n");
    scanf("%d",&n);
    if(!ListLocate(L,n,&pos)) printf("抱歉位置錯誤\n");
    else {printf("|"); printf("         %d在連結串列中的位置是%d          ",n,pos) ;printf("|\n");}
    printf("|"); printf("   請分別輸入要插入元素的值和位置     ") ;printf("|\n");
    scanf("%d%d",&n,&pos);
    ListInsert_L(L,pos,n);
    printf("|"); printf("         當前連結串列的內容是            ") ;printf("|\n");
    ListTreverse_L(L);
    printf("|"); printf("       請輸入刪除元素的位置          ") ;printf("|\n");
    scanf("%d",&temp);
    if(!ListDelete_L(L,5,&temp)) printf("抱歉位置錯誤\n");
    printf("|"); printf("         當前連結串列的內容是            ") ;printf("|\n");
    ListTreverse_L(L);
    return 0;
}

執行結果

這裡寫圖片描述

約瑟夫環問題

實驗要求

問題描述

編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程式求出出列順序。

基本要求

選擇單向迴圈連結串列作為儲存結構模擬整個程序,按照出列的順序輸出各人的編號。

測試資料

m的初值為20;n=7,7個人的密碼依次為:3,1,7,2,4,8,4。

程式程式碼

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int Status;
typedef int Boolean;
typedef struct LNode{
    ElemType data;
    struct LNode * next;
}LNode, *LinkList;
int code[1000] = {};
LinkList head;
Status ListIsEmpty_L(LinkList L)
{
    if(L->next == NULL) return FALSE;
    else return TRUE;
}
Status GetElem_L(LinkList L, int i, ElemType *e)
{
    LinkList p = L->next; int j = 1;
    while(p && j<i){
        p = p->next; ++j;
    }
    if(!p || j>i) return ERROR;
    *e = p->data;
    return OK;
}
Status ListInsert_L( LinkList  L, int i, ElemType e)
{
    LinkList p = L; int j = 0;
    while(p && j<i-1){
        p = p->next; ++j;
    }
    if(!p || j>i-1) return ERROR;
    LinkList s= (LinkList) malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}
Status ListDelete_L(LinkList  L, int i, ElemType * e)
{
    LinkList p = L; int j = 0;
    while(p->next && j< i-1){
        p = p->next; ++j;
    }
    if(!(p->next) || j>i-1) return ERROR;
    LinkList q = p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return OK;
}
void CreatList_L(LinkList &L , int n)
{
    L = (LinkList) malloc(sizeof(LNode));
    L->next = NULL;int num = n;
    for(int i = 0; i<n; ++i){
        LinkList p = (LinkList) malloc(sizeof(LNode));
        p->data = num--;
        p->next = L->next;
        L->next = p;
        if(!i) head = p;
    }
    head->next = L->next;
}
Status ListTreverse_L(LinkList L)
{
    if(L->next == NULL) return ERROR;
    else{
        LinkList p = L->next;
        bool first = true;
        while(p){
            if(first){
                printf("%d",p->data);
                first = false;
            }else{
                printf(" %d",p->data);
            }
            p = p->next;
        }
        printf("\n");
    }
    return OK;
}
Status ListLenth(LinkList L,int * length )
{
    if(!L->next) *length = 0;
    else{
        LinkList p = L->next; int j = 0;
        while(p){
            j++;
            p = p->next;
        }
        * length = j;
    }
    return OK;
}
Status ListLocate(LinkList L, int n,int *e)
{
    if(!L->next) *e = 0;
    else{
        LinkList p = L->next;
        int j = 1;
        while(p->data != n){
            p = p->next;
            ++j;
        }
        *e = j;
    }
    return OK;
}
Status Joseph(LinkList L,int n,int num)
{
    LinkList sta = L->next;
    LinkList ft;
    int cnt = 0 ; num = num-1;
    while(cnt != n){
        while(num--){
            ft = sta;
            sta = sta->next;
        }
        printf("%d ",sta->data);
        cnt++;
        num = code[sta->data-1];
        ft->next = sta->next;
    }
    return OK;
}
int main()
{
    LinkList L;
    int n,m;
    printf("請輸入總共有幾個人:\n");
    scanf("%d",&n);
    printf("請輸入初始密碼值:\n");
    scanf("%d",&m);
    printf("請依次輸入1-%d號手中的密碼值:\n",n);
    for(int i = 0; i<n;++i) scanf("%d",&code[i]);
    CreatList_L(L,n);
    printf("%d個人的出隊順序依次為:\n",n);
    Joseph(L,n,m);
    return 0;
}

執行結果

這裡寫圖片描述