1. 程式人生 > >實驗三順序表以及靜態連結串列

實驗三順序表以及靜態連結串列

1.順序表的實現

#include<iostream.h>
const int Maxsize=15;
class ScoreList
{
public:
void Insert(int i,int x);
int Delete(int i);
int Search(int x);
void Print();
ScoreList(){length=0;}
ScoreList(int a[],int n);
~ScoreList(){}
private:
int data[Maxsize];
int length;
};


ScoreList::ScoreList(int a[],int n)
{
if(n>Maxsize)throw"引數非法";


for(int i=0;i<n;i++)
data[i]=a[i];
length=n;
}


void ScoreList::Insert(int i,int x)
{
if(length>=Maxsize)throw"上溢";
if(i<1||i>length+1)throw"位置非法";
for(int j=length;j>=i;j--)
data[j]=data[j-1];
data[i-1]=x;
length++;
}


int ScoreList::Delete(int i)
{
if(length==0)throw"下溢";
if(i<1||i>length)throw"位置非法";

int x=data[i-1];
for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}




int ScoreList::Search(int x)
{
for(int i=0;i<length;i++)
if(data[i]==x)
return i+1;
}


void ScoreList::Print()
{
for(int i=0;i<length;i++)
cout<<"成績:"<<data[i]<<" "<<endl;}




int main()
{
int b[5]={11,22,33,44,55};

ScoreList S(b,5);
cout<<"插入前資料為"<<endl;
S.Print();
cout<<"在第3個位置插入成績為66的元素"<<endl;
S.Insert(3,66);
cout<<"現資料為"<<endl;
S.Print();
cout<<"刪除第2個成績"<<endl;
S.Delete(2);
cout<<"現資料為"<<endl;
S.Print();
cout<<"查詢成績為55的位置"<<endl;
cout<<S.Search(55)<<endl;

return 0;}

2.靜態連結串列

#include<iostream.h>    
#include<string>    
       
const int Maxsize = 100;    
template<typename T>    
class Node {    
public:    
    T data;    
    int next;      //儲存指向下一個節點的陣列下標    
};    
    
template <typename T>      
class SLL {      
public:      
    SLL();//無參建構函式      
    SLL(T score[],int n);//帶參建構函式      
    virtual ~SLL();//空的解構函式        
    void print();//遍歷操作     
    T get(int i);//按位查詢操作    
    int Locate(T x);//按值查詢操作    
    void insert(int i, T x);//插入操作    
    void Delete(int i);//刪除操作    
private:      
    Node<T> node[Maxsize];//節點      
    int first;      
    int avail;//指向空閒鏈的頭指標      
    int length;//當前靜態連結串列的長度    
};    
    
template<typename T>    
SLL<T>::SLL(T score[],int n)    
{    
    length = 0;    
    for(int i = 0; i<Maxsize; i++)    
    {    
        node[i].next=i+1;    
    }    
    node[Maxsize - 1].next = -1;      
    avail = 2;      
    first = 1;      
    node[first].next = -1;      
    for (int j = n-1; j >=0; j--)      
    {      
        if (avail == -1)      
        {      
            break;      
        }      
        int s = avail;      
        avail = node[avail].next;//空閒鏈的頭指標後移      
        node[s].data = score[j];//將score[j]填入下標為S的節點      
        node[s].next = node[first].next;//將score[j]插到first後面      
        node[first].next = s;      
        length++;      
    }      
}    
template<class T>      
SLL<T>::~SLL()      
{      
}    
    
template<typename T>    
void SLL<T>::print()    
{    
    int s = node[first].next;    
    for (int i = 1; i <= length; i++)    
    {    
        cout << node[s].data << " ";    
        s = node[s].next;    
    }    
}       
    
template<typename T>    
T SLL<T>::get(int i)    
{    
    if(i<=0 || i>length) throw"位置非法";    
    int p = first;    
    for(int j = 0; j<i; j++)    
    {    
        p=node[p].next;    
    }    
    return node[p].data;    
}    
    
template<typename T>    
int SLL<T>::Locate(T x)    
{    
    int count=0;    
    int p = first;    
    while(node[p].next != -1)    
    {    
        p=node[p].next;    
        if(node[p].data == x) return count+1;    
        count++;    
    }    
    return -1;    
}    
    
template<typename T>    
void SLL<T>::insert(int i, T x)    
{    
    if(i<0||i>length) throw"位置非法";    
    int p = first;    
    for(int j = 1; j<i; j++)    
    {   p=node[p].next;   }    
    int s = node[avail].next;    
    node[avail].data = x;      
    node[avail].next = node[p].next;      
    node[p].next = avail;      
    avail = s;      
    length++;    
}    
    
template<typename T>    
void SLL<T>::Delete(int i)    
{    
    if(i<0||i>length+1) throw"位置非法";    
    int p = first;    
    for(int j = 1;j<=i; j++)    
    {    p=node[p].next;  }    
    int q = node[p].next;      
    T e = node[p].data;      
    node[p].next = node[q].next;      

相關推薦

實驗順序以及靜態連結串列

1.順序表的實現 #include<iostream.h>const int Maxsize=15;class ScoreList{public: void Insert(int i,int x); int Delete(int i); int Search(int x); void

實驗:用雙鏈靜態連結串列以及間接定址實現基本的學生管理系統

實驗目的:鞏固線性表的資料的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。 實驗內容:建立一個由n個學生成績的線性表,n的大小由自己確定,每個學生的成績資訊由自己確定,實現資料的對錶進行插入、刪除、查詢等操作。 (1)用雙鏈表實現 源程式: #incl

資料結構與演算法()-線性靜態連結串列

前言:前面介紹的線性表的順序儲存結構和鏈式儲存結構中,都有對物件地引用或指向,也就是程式語言中有引用或者指標,那麼在沒有引用或指標的語言中,該怎麼實現這個的資料結構呢? 一、簡介   定義:用陣列代替指標或引用來描述單鏈表,即用陣列描述的連結串列叫做靜態連結串列,這種描述方法叫做遊標實現法;  

資料結構——線性順序、單鏈靜態連結串列、迴圈連結串列、雙向連結串列

提示:以下內容不適合零基礎人員,僅供筆者複習之用。 一、線性結構的基本特徵: 1.集合中必存在唯一的一個“第一元素”; 2.集合中必存在唯一的一個 “最後元素”; 3.除最後元素在外,均有 唯一的後繼; 4.除第一元素之外,均有 唯一的前驅。 如:j

迴圈佇列(順序實現,連結串列實現)

迴圈佇列 迴圈佇列是將順序佇列變為一個變成一個環狀的空間。頭尾指標以及佇列元素之間的關係不變,只是在迴圈佇列中,頭尾指標“依環狀增 1”的操作可用”模“運算來實現。通過取模運算,頭指標和尾指標就可以在順序表空間內以頭尾銜接的方式迴圈移動。 隊空條件:Q.front == Q.rear

順序(陣列)與連結串列的區別

相關文件 演算法和資料結構系列 學習演算法和資料結構:線性結構 順序表 順序表一般視為陣列,使用一組地址連續的儲存單元依次儲存資料元素 順序表具有以下特點: 長度固定,必須在記憶體分配之前確定陣列長度; 儲存空間連續,即允許隨機訪問任意元素; 資料

資料結構實驗順序學生資訊

#include<iostream.h> class Student {private: char name[2000]; int number; int score; char sex[2000]; public: static int count; vo

詳述線性(單鏈,雙鏈靜態連結串列和迴圈連結串列

線性表:由零個或多個數據元素組成的有限序列。     關鍵點: 有限序列第一個元素有且僅有一個前驅結點,最後一個與元素有且僅有一個後繼結點,中間元素有一個前驅結點和一個後繼結點線性表

線性(陣列、單鏈靜態連結串列、迴圈連結串列、雙向連結串列

線性表的定義 線性表(List):零個或多個數據元素的有限序列。 有幾個地方需要強調: 首先它是一個序列,也就是說元素之間是有順序的,若元素存在多個,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且只有一個前驅和後繼。 然後線性表強調的是有限的。 最

【線性靜態連結串列

StaticLinkedList.h #ifndef STATICLINKEDLIST_H #define STATICLINKEDLIST_H #include<iostream> const int max_size = 1000; //list nod

資料結構實驗靜態連結串列學生資訊

#include<iostream>   #include<string>   using namespace std;      //靜態連結串列的儲存結構   c

實驗靜態連結串列實現學生成績管理系統

#include<iostream.h> #include<stdlib.h> typedef int ElemType; typedef int DataType; const int MaxSize=100; typedef struct { ElemType data

java中的順序連結串列,單鏈,雙鏈,迴圈連結串列

今天昨天學了集合框架,但是在List介面下有兩個子類涉及到了連結串列,書上又提到了一個關鍵的詞“雙向迴圈連結串列”,折騰了一整天終於搞懂了。 首先我們得明白什麼是連結串列,連結串列是環環相扣的一組資料,而我們常用的陣列就是一組順序連結串列,在分配記憶體時記憶體將對陣列分配一組”連續的記憶體空間“

【資料結構與演算法】之單鏈、雙鏈、迴圈連結串列的基本介紹及其Java程式碼實現---第

一、連結串列的基本介紹 連結串列的定義:連結串列是一種遞迴的資料結構,它或者為空(null),或者是指向一個結點(node)的引用,該結點含有一個泛型的元素和一個指向另一條連結串列的引用。----Algorithms  Fourth  Edition   常見的連結串

線性-靜態連結串列

靜態連結串列 用陣列來代替指標,來描述單鏈表 將陣列元素分成兩個資料域,data和cur。data用來存放資料元素,cur存放該元素的後繼在陣列中的下標(遊標)。<遊標實現法> 1.基本結構 /*線性表的靜態連結串列儲存結構*/ #define

線性的清空與線性的銷燬有什麼區別 靜態連結串列與陣列的區別

線性表的清空: bool SqList::ClearList() {  length=0;  return true; } 線性表的銷燬: bool SqList::DestoryList() {  delete []p;  p=NULL;     return true;

陣列、單鏈和雙鏈介紹 以及 雙向連結串列的C/C++/Java實現

1 #include <stdio.h> 2 #include <malloc.h> 3 4 /** 5 * C 語言實現的雙向連結串列,能儲存任意資料。 6 * 7 * @author skywang 8 * @date 2

線性連結串列的實現(二)-靜態連結串列實現

靜態連結串列基本概念 這一部分的內容主要參照了這篇帖子[靜態連結串列 C實現]的內容。並且貼上的說明圖也是來自於這篇帖子,再次特做宣告。 什麼是靜態連結串列 用全域性資料實現的連結串列叫做靜

靜態連結串列的建立以及基本操作

#include <stdio.h> #include <stdlib.h> #define Max 100 typedef int ElemType; /*定義每個節點的資料資訊*/ typedef struct Node { ElemType

資料結構筆記(靜態連結串列的實現和基本操作

一、靜態連結串列的定義 用資料替代指標,來描述單鏈表。首先,資料的元素由兩個資料域組成,data和cur。資料域data,用來存放資料元素,即要處理的資料;遊標cur相當於單鏈表中的next指標。 //線性表的靜態單鏈表儲存結構 #define MAXSIZ