线性表

来源:互联网 发布:淘宝官方活动 编辑:程序博客网 时间:2024/06/04 19:39

</pre><span style="white-space:pre"></span>     <span style="font-size:24px"><strong>前言</strong></span><p></p><p><span style="font-size:18px"><span style="white-space:pre"></span>本人大三,在学校里学了个皮毛,想想整个大学也没留下什么,写点什么也算是点补偿吧,多少年后看到自己写的东西会不会有点哭笑不得~O(∩_∩)O哈哈~不多说,那就在这里记下大学的点滴吧。</span></p><p><span style="white-space:pre"></span>  <strong><span style="font-size:24px">线性表的定义</span></strong></p><p><span style="font-size:24px; white-space:pre"><strong></strong></span><span style="font-size:14px">线性表是零个或者多个具有相同类型数据元素的有序序列。非空线性表可以表示为:L=(a1,a2,....ai,......an),其中ai为线性表的第i个数据元素。表中数据元素的个数n称为线性表的长度。长度为零时称为空表。</span></p><p><span style="font-size:14px; white-space:pre"></span><strong><span style="font-size:24px">线性表的顺序存储结构及实现</span></strong></p><p><span style="font-size:24px; white-space:pre"><strong></strong></span><span style="font-size:18px">我们知道线性表是一种最基本、最简单的数据结构。线性表有二种存储结构,一种是顺序存储,另一种是链式存储结构,等下来比较下其区别,现在来看下线性表的顺序存储结构。什么是顺序存储结构呢?其实指的是用一组地址连续的存储单元依次存放线性表中的数据元素。</span></p><p><span style="font-size:18px; white-space:pre"></span><strong><span style="font-size:24px">顺序表的实现</span></strong></p><p><span style="font-size:24px; white-space:pre"><strong></strong></span><span style="font-size:18px">顺序表的实现无非就是些初始化,插入一个元素(增),删除一个元素(删),修改一个一个元素(改),查找一个元素(查)等基本操作。顺序表用一组地址连续的存储单元来存放线性表中的数据元素,存储单元的申请可以采用静态或动态的方式。我这里就用动态的方式了,动态的话就需要设置一个指针变量,来指示基地址的位置,同时由于数据元素的类型不确定,这里我采用了C++的模板机制。下面是编写的代码。</span></p><p><span style="font-size:18px">下面的代码定义到Sqlist.h文件里</span></p><p><span style="font-size:18px"></span></p><pre name="code" class="cpp">//类的定义template <class T>class SqList   //顺序表类{private:T *elem; //表首址int length; //表长int listsize;//表容量public:SqList(int m) ;//构造函数, 创建容量为m的空表~SqList();//析构函数,删除表空间void CreateList(int n);//创建具有n个元素的线性表void Insert(int i,T e);//在表中第i个位置插入元素T Delete(int i);//删除表中第i个元素T GetElem(int i);//获取第i个元素的值int Locate(T e);//元素定位void Clear();//清空表int Empty();//测表空int Full();//测表满int Length();//测表长void ListDisp();//输出表元素};//类的实现template<class T>SqList<T>::SqList(int m){//构建函数,创建一表容量为m的空表elem=new T[m];// 申请表空间length=0;// 空表,表长为0listsize=m;//表容量为m}template<class T>SqList<T>::~SqList()//析构函数{//释放表空间delete [] elem;length=0; listsize=0; }template<class T>void SqList<T>::CreateList(int n){//创建表长度为n的顺序表if(n>listsize) throw"参数非法";cout<<"请依次输入"<<n<<"个元素值:"<<endl;for(int i=1;i<=n;i++)   cin>>elem[i-1];length=n;}template<class T>void SqList<T>::Insert (int i,T e){// 在第i个位置插入元素,如不能插入,显示异常信息if(length>=listsize) throw "上溢";if(i<1||i>length+1) throw "插入位置异常";for(int j=length;j>=i;j--)elem[j]=elem[j-1];elem[i-1]=e;length++;}template <class T>T SqList<T>::Delete (int i){// 删除表中第i个位置元素,如不能删除,显示异常信息。T x;if(length==0) throw "下溢";if(i<1||i>length+1) throw "删除位置异常";x=elem[i-1];for(int j=i;j<length;j++)elem[j-1]=elem[j];length--;return x;}template<class T>int SqList<T>::Locate (T e){// 元素定位,若找到,返回该元素在表中的位序;末找到,返回0。for(int i=0;i<length;i++)if(elem[i]==e) return i+1;return 0;}template<class T>void SqList<T>::Clear(){//把表清空length=0;}template<class T>T SqList<T>::GetElem(int i){//获取第i个元素的值T e;if(i<1||i>length) throw "位置不合法";e=elem[i-1];return e;}template<class T>int SqList<T>::Empty(){//判表空。若空,返回1;否则,返回0if(length==0)return 1;elsereturn 0;}template<class T>int SqList<T>::Full(){//判表满。若满,返回1;否则,返回0if(length==listsize)return 1;elsereturn 0;}template <class T>int SqList<T>::Length(){//返回表长return length;}template <class T>void SqList<T>::ListDisp(){//显示表内容for(int i=0;i<length;i++){cout<<elem[i]<<"\t";}cout<<endl;}
下面是SqList.c文件。代码如下所示

#include<iostream.h>//cout,cin#include"process.h"//exit()#include"stdio.h"//EOF,NULL#include "SqList.h"char pause;typedef int T; //主函数int main(){int i;T e;SqList<int> L(20);//建立容量为20、元素类型为整型的空顺序表system("cls");//执行系统命令cls,清屏int choice;    do{//显示主菜单cout<<"1-创建顺序表\n";cout<<"2-在链表第i个位置插入元素\n";cout<<"3-删除顺序表中第i个位置的元素\n";cout<<"4-返回第i个元素的值\n";cout<<"5-元素定位\n";cout<<"6-清空表\n";cout<<"7-测表空\n";cout<<"8-测表满\n";cout<<"9-测试表长\n";cout<<"10-显示链表\n";cout<<"11-退出\n";cout<<"Enter choice:";cin>>choice;switch(choice){case 1://创建表 cout<<"请输入要创建的顺序表中元素个数:";cin>>i;cout<<endl;try{L.CreateList(i);}catch(char *err){ cout<<err<<endl; }break;case 2://元素插入cout<<"请输入插入位置:";cin>>i;cout<<endl;cout<<"请输入插入元素的值:";cin>>e;cout<<endl;try{L.Insert(i,e);}catch(char *err){ cout<<err<<endl; }break;case 3://元素删除 cout<<"请输入删除位置:";cin>>i;cout<<endl;try{e=L.Delete(i);cout<<"被删除元素为:"<<e<<endl;}catch(char *err){ cout<<err<<endl; }cin.get(pause);system("pause");break;case 4://返回第i个元素值cout<<"请输入要查询的元素位置:";cin>>i;try{e=L.GetElem(i);cout<<"第"<<i<<"个元素值为:"<<e<<endl;}catch(char *err){ cout<<err<<endl; }cin.get(pause);system("pause");break;case 5:// 按值进行元素查询cout<<"请输入要查询的元素值:";cin>>e;//i=L.Locate(e);cout<<"查询元素"<<e<<"位于在表中的位置为:"<<i<<endl;cin.get(pause);system("pause");break;case 6://清空表L.Clear();cout<<"表已清空"<<endl;cin.get(pause);system("pause");break;case 7://测表空i=L.Empty();if(i) cout<<"表空"<<endl;elsecout<<"表不空"<<endl;cin.get(pause);system("pause");break;case 8://测表满i=L.Full();if(i) cout<<"表满"<<endl;elsecout<<"表未满"<<endl;cin.get(pause);system("pause");break;case 9://测表长 i=L.Length();cout<<"表长为:"<<i<<endl;cin.get(pause);system("pause");break;case 10://遍历显示表L.ListDisp();cout<<endl;cin.get(pause);system("pause");break;case 11://退出cout<<"结束运行"<<endl;                                break;default://非法选择cout<<"Invalid choice\n";break;}}while(choice!=11);return 0;}
下面是运行的结果了。



线性表的链式存储结构及实现

定义:用一组任意的存储单元来存放线性表的元素,存储单元可以是连续的也可以是不连续的,这里要注意几个概念,一个是结点(可以这么理解吧,一辆火车是由一节一节车厢组成的,每一节车厢就是一个结点,火车头就是一个头结点,火车尾就是尾结点),一个是数据域(存放数据元素自身信息的),一个是指针域(存储后继或前驱逻辑关系的)。

好吧,还是写程序吧,我们还是来实现下链式存储结构的实现代码,

下面是LinkList.h文件的代码

template <class T>struct Node{  //链表是由一系列结点的对象组成的T data;  //数据域Node *next;//指针域};template <class T>class LinkList{private:Node<T> *Head;  //头指针,指向表头public:LinkList();//构造函数,创建空链表~LinkList();//析构函数,删除表空间void CreateList(int n);//创建具有n个元素的线性链表void Insert(int i,T e);//在表中的第i个位置插入元素eT Delete(int i);  //删除表中第i个元素T GetElem(int i); //查找第i个元素的值int Locate(T e);//在链表中查找值为e的元素T prior(T e); //返回元素e的前驱int Empty();//判断表空int Length();//测表的长度void Clear(); //清空表void ListDisplay();//输出表的元素};template <class T>LinkList<T>::LinkList(){  //构造函数,创建空链表Head = new Node<T>; //创建一个新的结点,该结点为头结点Head->next = NULL;}template <class T>LinkList<T>::~LinkList(){ //析构函数,销毁空间Node <T>*p;while(Head){  //从表头结点开始依次释放空间,直到尾结点p = Head;Head = Head ->next;delete p;   //删除p指向的结点}Head=NULL;}template <class T>//创建一个单链表,有二种方法,头插法(每次将新申请的结点插在头结点的后面),尾插法(每次将新申请的结点插在尾结点的后面)//头插法void LinkList<T>::CreateList(int n){Node <T>*s;for(int i =n;i>=1;i--){s = new Node<T>; //新建元素结点cin>>s->data;  //输入新建数据元素的值s->next = Head->next; //新结点插入到头结点的后面Head->next = s;}}template <class T>void LinkList<T>::Insert(int i,T e){  //插入一个新的结点,Node<T>*p;p = Head; //指针初始化int j = 0; //计数器初始化为0while(p&&j<i-1)//定位到插入点之前{p = p->next;j++;}if(!p||j>i-1)throw "插入位置错误";else{Node<T> *s = new Node<T>; //创建一个新的结点s->data = e;s->next = p->next;  //将结点s链接到p结点之后p->next = s;}}template <class T>T LinkList<T>::Delete(int i){ //删除元素T x ;Node <T> *p,*q;  //设置工作指针p = Head;int j = 0;while(p->next && j<i-1){ //定位到删除点的前驱p = p->next;j++;}if(!p->next ||j>i-1){throw"删除的位置异常";}else{q = p->next; //暂存删除结点的位置q->next = q->next;//从链表中摘除删除结点x = q->data; //取出删除数据元素的值delete q;  //释放删除点return x;  //返回删除元素的值}}template <class T>T LinkList<T>::GetElem(int i){//查找第i个位置元素的值Node<T>*p;  //设置工作指针p = Head->next;int j=1;  //计数器初始化while(p&&j<i){p= p->next;j++;}if(!p||j>i){//定位位置不合适,空表或i小于0throw"位置不合适";}else{return p->data;}}template <class T>int LinkList<T>::Empty(){//清空表if(Head->next==NULL){return 1;}else{return 0;}}template <class T>T LinkList<T>::prior(T e){//返回元素前驱Node <T>*p,*q;p = Head;q = q->next;while(q&&q->data!=e){p =q;q = q->next;}if(p==Head){throw"首元素,没有前驱结点";}else if(q==NULL){throw"元素不存在";}else{return p->data;}}template <class T>int LinkList<T>::Length(){  //测试链表的长度int length = 0;Node <T>*p;//指向头结点while(p->next){length++;p = p->next;}return length;}template <class T>void LinkList<T>::ListDisplay(){//显示链表的数据元素Node<T> *p;p = Head ->next;int i =1;while(p){cout<<p->data<<"\t";p = p->next;i++;}cout<<endl;}
接下来写主函数了,下面是LinkList.c代码

#include<iostream.h>#include"stdio.h"#include"LinkList.h"#include"process.h"char pause;typedef int T;int main(){T e;int i;LinkList<int>L;int choice;do{cout<<"1--创建一个链表\n";cout<<"2--在链表第i个位置插入元素\n";cout<<"3--删除链表中第i个元素\n";cout<<"4--查找第i个元素的值\n";cout<<"5--显示链表\n";cout<<"输入你的选择\n";cin>>choice;switch(choice){case 1:cout<<"输入要创建链表的个数";cin>>i;cout<<endl;try{L.CreateList(i);}catch(char *err){cout<<err<<endl;}cin.get(pause);system("pause");break;case 2:cout<<"输入要插入的位置\n";cin>>i;cout<<endl;cout<<"输入要插入的值\n";cin>>e;cout<<endl;try{L.Insert(i,e);}catch(char *err){cout<<err<<endl;}cin.get(pause);system("pause");break;case 3:cout<<"输入要删除的位置\n";cin>>i;cout<<endl;try{e = L.Delete(i);cout<<"被删除的元素为:"<<e<<endl;}catch(char *err){cout<<err<<endl;}cin.get(pause);system("pause");break;case 4:cout<<"输入要查询的元素的位置\n";cin>>i;try{e = L.GetElem(i);cout<<"第"<<i<<"个元素的值为"<<e<<endl;}catch(char *err){cout<<err<<endl;}cin.get(pause);system("pause");break;case 5:L.ListDisplay();cout<<endl;cin.get(pause);system("pause");break;}}while(choice!=11);return 0;}

O(∩_∩)O哈!~下面是运行结果


有点累了,第一次写博客,有点吃力~








1 0
原创粉丝点击