資料結構實驗1— 線性表、連結串列的實現
阿新 • • 發佈:2018-12-26
實現順序表各種基本操作
實驗要求
編寫程式實現順序表的各種基本運算,並在此基礎上設計一個主程式完成如下功能:
(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;
}