1. 程式人生 > >實驗三:用雙鏈表、靜態連結串列以及間接定址實現基本的學生管理系統

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

實驗目的:鞏固線性表的資料的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。

實驗內容:建立一個由n個學生成績的線性表,n的大小由自己確定,每個學生的成績資訊由自己確定,實現資料的對錶進行插入、刪除、查詢等操作。

(1)用雙鏈表實現

源程式:

#include <iostream>

using namespace std;

template <typename T>

struct node{

    T data;

    node<T> *prior,*next;

};

template <typename T>

 class nLink

{

private:

    node<T> *head;

public:

    nLink()

    {

        head = new node<T>;

        head->next = head->prior = NULL;

    }

    ~nLink()

    {

        DestoryLink();

    }

    void ClearLink()

    {

        node<T> *p = head->next,*q = NULL;

        while(p){

            q = p->next;

            delete p;

            p = q;

        }

        head->next = NULL;

    }

    void DestoryLink()

    {

        ClearLink();

        if(head){

            delete head;

            head = NULL;

        }

    }

    void PrintLink()

    {

        node<T> *p = head->next;

        while(p){

            cout<<p->data<<" ";

            p = p->next;

        }

        cout<<endl;

    }

    bool AppendLink(T e)

    {

        node<T> *p = head,*s = NULL;

        s = new node<T>;

        if(s == NULL)

            return false;

        s->data = e;

        s->next = s->prior = NULL;

        while(p->next){

            p = p->next;

        }

        p->next = s;

        s->prior = p;

        return true;

    }

    int Length()

    {

        int i = 0;

        node<T> *p = head->next;

        while(p)

        {

            ++i;

            p = p->next;

        }

        return i;

    }

    bool InsertLink(int pos , T e)

    {

        node<T> *p = head , *s = NULL;

        int j = 0;

        s = new node<T>;

        if(s == NULL)

            return false;

        s->data = e;

        s->prior = s->next = NULL;

        while(p && j < pos -1)

        {

            ++j;

            p = p->next;

        }

        if(p == NULL || j > pos - 1)

        {

            return false;

        }

        s->next = p->next;

        if(p->next != NULL)

{

            p->next->prior = s;

        }

        p->next = s;

        s->prior = p;

        return true;

    }

    bool DeleteNode(int pos)

    {

        if(pos < 1 || pos > Length())

        {

            return false;

        }

        node<T> *p = head;  

        int j = 0;

        while(p && j < pos)

        {

            ++j;

            p = p->next;

        }

      

        if(p && p->next == NULL){

            p->prior->next = NULL;

            delete p;

            p = NULL;

        }else{

            p->prior->next = p->next;

            p->next->prior = p->prior;

            delete p;

            p = NULL;

        }

        return true;

    }

 

    bool DeleteNode(T e)

    {

        node<T> *p = head->next;

        while(p){

            if(p->data == e){

                break;

            }

            p = p->next;

        }

        if(p == NULL){

            cout<<"not found the elem :"<< e <<endl;

            return false;

        }

        if(p->next == NULL){

            p->prior->next = NULL;

        }else{

            p->prior->next = p->next;

            p->next->prior = p->prior;

        }

        delete p;

        p = NULL;

        return true;

    }

 

};

 

int main()

{

    nLink<char> link;

    for(int i = 0; i < 10;i++)

{

        link.AppendLink(80+i);

    }

    link.InsertLink(7,87);

    cout<<"Length ="<<link.Length()<<endl;

    link.PrintLink();

    link.DeleteNode(82);

    link.PrintLink();

    cout<<"Length ="<<link.Length()<<endl;

    return 0;

}

程式結果:


(2)用靜態連結串列實現

源程式:

 #include<iostream>

using namespace std;

#define MAXSIZE 100

typedef int ElemType;

typedef struct Node

{

    ElemType data;

    int cur;

} StaticLinkList[MAXSIZE];

bool InitList(StaticLinkList array)

{

    cout << "InitList..." << endl;

    for (int i = 0; i < MAXSIZE - 1; i++)

    {

        array[i].cur = i + 1;

    }

    array[MAXSIZE - 1].cur = 0;

    return true;

}

int Malloc_SLL(StaticLinkList array)

{

    int k = array[0].cur;

    if (k)

        array[0].cur = array[k].cur;

    return k;

}

void Free_SLL(StaticLinkList array, int pos)

{

    array[pos].cur = array[0].cur;

    array[0].cur = pos;

}

 

int ListLength(StaticLinkList array)

{

    int i = array[MAXSIZE - 1].cur;

    int j = 0;

    while(i)

    {

        i = array[i].cur;

        ++j;

    }

    return j;

}

bool ListInsert(StaticLinkList array, int pos, ElemType Elem)

{

    cout << "Insert List from pos : " << pos << " Item " << Elem << endl;

    if (pos < 1 || pos > ListLength(array) + 1)

        return false;

    int k = MAXSIZE - 1;

    int i = Malloc_SLL(array);

    if (i)

    {

        array[i].data = Elem;

        for (int l = 1; l <= pos - 1; l++)

            k = array[k].cur;

        array[i].cur = array[k].cur;

        array[k].cur = i;

        return true;

    }

 

    return false;

}

bool ListDelete(StaticLinkList array, int pos)

{

    cout << "Delete List from pos: " << pos << endl;

    if (pos < 1 || pos > ListLength(array))

        return false;

    int k = MAXSIZE - 1;

    for (int l = 1; l <= pos - 1; l++)

        k = array[k].cur;

 

    int j = array[k].cur;

    array[k].cur = array[pos].cur;

 

    Free_SLL(array, j);

 

    return true;

}

 

bool ListTraverse(StaticLinkList array)

{

    cout << "List Traverse : " << endl;

    int k = MAXSIZE - 1;

    while (array[k].cur!= 0)

    {

        k = array[k].cur;

        cout << array[k].data << ' ';

    }

    cout << endl;

    return true;

}

int main()

{

    StaticLinkList SSL;

    InitList(SSL);

    for (int i = 1; i <MAXSIZE-1; i++)

        ListInsert(SSL, i, i);

    ListTraverse(SSL);

    ListDelete(SSL, 45);

    ListTraverse(SSL);

    cout << "List Length : " << ListLength(SSL) << endl;

 

    return 0;

}

程式結果:


(3)間接定址實現

源程式:

#include <iostream>

using namespace std;                                      

const int MaxSize=100;                   

template<class DataType>                                                    

struct Node    

{

DataType data;

};                     

 template<class DataType>                                   

 class  Link           

{

public:

     Link(DataType a[],int n);

     ~Link() {}

     void Insert(int i,DataType x);

 int Locate(DataType x);

     DataType Delete(int i);

     void PrintList();

     private:

      Node<DataType>*address[MaxSize];

      int length;

};

template<class DataType>

Link<DataType>::Link(DataType a[],int n)

{      

for(int i=0;i<n;i++)

{

address[i]=new Node<DataType>;

        address[i]->data=a[i];

}

    length=n;

}

template<class DataType>

void Link<DataType>::Insert(int i,DataType x)

{

if(i<=length&&i>0)

{

for(int j=length;j>=i;j--)

{

      address[j]=address[j-1];

}

      address[i-1]->data=x;

      length++;

}

 

else

{  

throw"位置";

}

}

template<class DataType>

DataType Link<DataType>::Delete(int i)

{

    if(i<=length&&i>0)  

{

        int x=address[i-1]->data;

     for(int j=i;j<length;j++)

     {

 address[j-1]=address[j];

 }

       length--;

       return x;

}

   else

   {

   throw"位置";

   }

}

template<class DataType>

int Link<DataType>::Locate(DataType x)  

{

    int i=0;

    for(i;i<length;i++)

{

       if(address[i]->data==x)

   {

   return i+1;

   }

}

return 0;

}

template<class DataType>

void Link<DataType>::PrintList()

{

for(int i=0;i<length;i++)

{

    cout<<address[i]->data<<" ";

 }

}

int main()

{

int s[5]={74,89,55,90,67};

  Link<int>L(s,5);

  cout<<"執行插入成績操作前資料為:"<<" ";

  L.PrintList();

  cout<<endl;

  try

  {

L.Insert(2,74);

  }

  catch(char *s)

  {

  cout<<s<<endl;

  }

  cout<<"執行插入操作後資料為:"<<" ";

  L.PrintList();

  cout<<endl;

  cout<<"值為74的元素位置為:";

  cout<<L.Locate(74)<<endl;

  L.PrintList();

  cout<<"執行刪除第一個學生成績操作前資料為:"<<" ";

  cout<<endl;

  try

  {

  L.Delete(1);

  }

  catch(char*s)

  {

  cout<<s<<endl;

  }

  cout<<"執行刪除成績操作後資料為:"<<" ";

  L.PrintList();

  cout<<endl;

  return 0;

}

程式結果: