c++实验3 链式存储线性表
1、线性表链式存储结构及基本操作算法实现
(1)单链表存储结构类的定义:
#include <iostream> using namespace std; template <class T> class LinList { private: ListNode <T> *head; //头指针 int size; //当前的数据元素个数 ListNode <T> *Index(int i); //定位 public: LinList(void); //构造函数 LinList(T a[],int i) ~LinList(void); //析构函数 int Size(void) const; //取当前数据元素 void Insert(const T& e,int i); //插入 T Delete(int i,T& e); //删除 T GetData(int i); //取数据元素 void GetAll(); //取得所有数据 int countnum(); //元素个数 bool isnull(); //判断列表是否为空 void deleteall(); //删除所有节点 };
(2)初始化带头结点空单链表构造函数实现
template <class T> LinList <T>::LinList() //构造函数 { head=new ListNode <T>(); //头指针指向头结点 size=0; //size的初值为0 }
(3)利用数组初始化带头结点的单链表构造函数实现
template <class T> LinList <T>::LinList(T a[],int i) { head=new ListNode<T>(); size=0; if(int j=0;j<i;j++) { ListNode<T>*p; p=new ListNode<T>(a[i],head->next); head->next=p; size++; } }
(4)在带头结点单链表的第i个位置前插入元素e算法
template <class T> void LinList<T>::Insert(const T& e,int i); //插入 { if(i<0||i>size-1) { cout<<"参数i越界出错!"<<endl; exit(0); } ListNode <T> *p=Index(i-1); //p为指向第i-1个结点的指针 //构造新结点q的data域值为item,next域值为p->next ListNode <T> *q=new ListNode <T> (e,p->next); p->next=q; //新结点插入第i个结点前 size++; //元素个数加1 }
(5)在带头结点单链表中删除第i个元素算法
template <class T> T LinList<T>::Delete(int I,T& e); //删除 { if(size==0) { cout<<"链表已空无可删"<<endl; } if(i<0||i>size-1) { cout<<"参数i越界出错!"<<endl; exit(0); } ListNode <T> *s,*p=Index(i-1); //p为指向第i-1个结点指针 s=p->next; //s指向第i个结点 p->next=p->next->next; //第i个结点脱链 T x=s->data; e=x; delete s; //释放第i个结点空间 size--; //结点个数减1 return e; //返回第i个结点的data域值 }
(6)遍历单链表元素算法
template <class T> void LinList<T>::GetAll() { for(int i=0;i<=size-1;i++) { cout<<GetData(i)<<" "; } cout<<endl; }
(7)求单链表表长算法。
template <class T> int LinList<T>::Size(void) const { return size; }
(8)判单链表表空算法
template <class T> bool LinList<T>::isnull() { if(size==0) { cout<<"为空"<<endl; return 1; } else { cout<<"非空"<<endl; return 0; } }
(9)获得单链表中第i个结点的值算法
template <class T> T LinList<T>::GetData(int i) { if(i<0||i>size-1) { cout<<"参数i越界出错!"<<endl; exit(0); } ListNode<T>*p=Index(i) return p->data; }
主函数调用
#include <iostream> #include"LinList.h" using namespace std; int main() { LinList<int>li1335; int s[]={1,2,3,4,5,6,7,8,9,10}; int e; for(int i=0;i<10;i++) li1335.Insert(s[i],i); li1335.Delete(5,e); li1335.GetAll(); li1335.isnull(); li1335.deleteall(); li1335.isnull(); return 0; }
===========================================================
2、参考单链表操作定义与实现,自行完成单循环链表的类的定义与相操作操作算法。
(1)利用数组初始化带头结点的单循环链表构造函数实现
template <class T> CircleList::CircleList(T a[],int n) //创建方式大同小异,唯一的区别就是创建的最后将尾结点指向头结点 { if(n<0) cout << "你输入的长度不正确 " << endl; else { length = n; ListNode<T>*p,*q; //定义头尾节点 p = head; for(int i=0;i<n;i++) { q = new ListNode<T>(); q->data=a[i]; q->next = head; p->next = q; p = q; } } }
(2)在带头结点单循环链表的第i个位置前插入元素e算法
template <class T> void CircleList::insertNode(int n,T data) { Node *q,*p = new Node(); p->data = data; q = head; for(int i = 1;i<n;i++) q = q->next; p->next = q->next; q->next = p; length++; }
(3)在带头结点单循环链表中删除第i个元素算法
template <class T> void CircleList<T>::deleteNode(int i) //删除i位置的结点 { if(i<0||i>length) { cout<<"参数i越界错误\n"; exit(0); } else { ListNode<T> *p,*q; p = head; for(int j=1;j<i;j++) p=p->next; q = p->next; p->next = q->next; delete q; q = NULL; length--; } }
3、采用链式存储方式,并利用单链表类及类中所定义的算法加以实现线性表La,Lb为非递减的有序线性表,将其归并为新线性表Lc,该线性表仍有序(未考虑相同时删除一重复值)的算法。
template<class T> void sort1(int c,int d,T a[],T b[],LinList<T>li) { int amin=0,bmin=0; for(int i=0;i<c+d;i++) { if(amin==c) { for(int j=bmin;j<d;j++,i++) li.Insert(b[j],i); break; } if(bmin==d) { for(int j=amin;j<c;j++,i++) li.Insert(a[j],i); break; } if(a[amin]>b[bmin]) { li.Insert(b[bmin],i); bmin++; } else if(a[amin]<b[bmin]) { li.Insert(a[amin],i); amin++; } else { li.Insert(a[amin],i); amin++; bmin++; } } li.GetAll(); }