实验目的:巩固线性表的数据的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
实验内容:建立一个由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;
}
程序结果: