线性表
线性表是最简单、也是最基本的一种线性数据结构。
它有两种存储表示法:顺序表和链表,最基本的操作是插入、删除和查找等。
顺序存储结构就是从内存中取出一段连续地址的空间,将数据依次连续的存储在这段空间中。 顺序表
链式存储结构是指数据存储在内存中的地址是离散的,以数据节点为单位,每个节点包括数据域和指针域。 单链表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
顺序表的基本操作如下:
#include <stdio.h> #include <iostream.h> const int LIST_SIZE = 5; //顺序表长度 class List { private: int *elem; //顺序表 int length; //顺序表的当前长度 int listsize; //顺序表的长度 public: void InitList(); //构造一个空线性表 int GetElem(int i); //返回线性表第i个元素的值 int GetLocateElem(int value); //返回顺序表中第一个与element相等的元素的位序 int GetPreElem(int e); //返回线性表中e的前驱pre_e int Length(); //返回线性表长度 void Insert(int i, int e); //在线性表第i个元素前插入e int Delete(int i); //删除线性表中第i个元素,并用e返回被删数的值 void InputList(); //输入元素到表中 void OutputList(); //将顺序表中的元素输出 void DestroyList(); //销毁线性表 void ClearList(); //清空线性表 void IsEmpty(); //判断线性表是否为空 }; void List::InitList() { if((elem = new int[LIST_SIZE])== NULL) //(ElemType*)malloc(sizeof(int)* LIST_SIZE)) == NULL) //malloc动态分配内存空间,成功返回指针,失败返回NULL cout<<"出现错误"<<endl; else { length = 0; listsize = LIST_SIZE; cout<<"初始化成功"<<endl; } } void List::DestroyList() { if(elem == NULL) cout<<"出现错误"<<endl; else { delete[] elem; //free(elem); 系统自带的C语言函数free() cout<<"销毁成功"<<endl; } } void List::ClearList() { if (elem == NULL) cout<<"出现错误"<<endl; else { length = 0; cout<<"清空成功"<<endl; } } void List::IsEmpty() { if (length == 0) cout<<"为空"<<endl; else cout<<"不为空"<<endl; } int List::Length() { return length; } int List::GetElem(int i) { if ((i < 1)||(i > Length())) cout<<"数据溢出"<<endl; int j = 1,e; int *p; p = elem; while(j<i) { elem++; j++; } e = *elem; elem = p; return e; } int List::GetLocateElem(int value) { int *p; p = elem; for (int i = 1;i <= length; i++) { if (*elem == value) { elem = p; return i; } elem++; } elem = p; return 0; } int List::GetPreElem(int e) { int *p = elem ,*pre_e; int i = GetLocateElem(e); //这里不用&L 因为这是按引用调用 for (int j = 0;j < i - 2; j++) { elem++; } *pre_e = *elem; elem = p; return *pre_e; } void List::Insert(int i, int e) { if (i < 1||i > (length)+1) cout<<"数据溢出"<<endl; if (length >= listsize) { int *newList; newList = new int[listsize + 1]; //(ElemType*)realloc(L.elem,L.listsize + sizeof(ElemType)) ; for(int j=0;j<length;j++) { newList[j]=elem[j]; } delete[] elem; elem = newList; listsize++; } int *q = &(elem[i - 1]); int *p; for (p = &(elem[length - 1]);p >= q; p--) *(p + 1) = *p; *q = e; length++; cout<<"插入成功"<<endl; } int List::Delete(int i) { if ((i < 1)||(i > length)) cout<<"数据溢出"<<endl; int e = (elem[i - 1]); int *q; for (q = &(elem[i - 1]); q < &(elem[length - 1]); q++ ) { *q = *(q + 1); } length--; return e; } void List::OutputList() { if ((elem == NULL)||(length==0)) cout<<"出现错误"<<endl; else { for (int i = 0; i < length; i++) { cout<<elem[i]<<" "; } cout<<endl; } } void List::InputList() { int a; cout<<"enter numbers:"<<endl; for (int i = 0; i < LIST_SIZE; i++) { cin>>a; Insert(i+1, a); } } int main() { List La, Lb; int e; La.InitList(); Lb.InitList(); La.InputList(); Lb.InputList(); for (int i = 0; i < Lb.Length(); i++) { e = Lb.GetElem(i+1); printf("n%d",e); //将顺序表Lb的数据元素通过位置查询一个个输出 if (!La.GetLocateElem(e)) La.Insert(La.Length()+1, e); //判断Lb中的一个数据La中是否也有,如果没有,插入到La后 // Lb.elem++; } printf("nLa = "); La.OutputList(); La.Delete(5); La.OutputList(); La.ClearList(); return 0; }
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!