单链表的基本操作

来源:互联网 发布:sap软件实施 编辑:程序博客网 时间:2024/05/24 04:51

数据结构中很重要的内容之一就有线性表的操作,今天我就总结一下顺序表的基本操作吧!

头文件部分(一些基本的定义):

#include <iostream>//头文件1#include <malloc.h>using namespace std;
#define ERROR 0//头文件2#define OVERFLOW -1#define OK 1#define FALSE 0#define LIST_INIT_SIZE 100  //表的初始化大小#define INCREMENT 10   //当表满了时,重新分配空间时,表的增量typedef int ElemType;  //定义int为基本类型typedef int Status;typedef struct SqList{int length,listsize;//listsize是顺序表的大小,length是表中数据的个数ElemType *elem;  //表头指针}SqList;
接下来就是一些基本函数,这些函数我在建工程时,都是放在一个名为function.h的头文件里的,下面为了清晰,我会一一列出这些函数,并简单介绍其功能。

顺序表初始化:

Status InitList(SqList &L) //以引用方式传参{L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem){cout<<"内存分配失败!"<<endl;exit(ERROR);}L.length = 0;  //当前表中元素为0L.listsize = LIST_INIT_SIZE;   //表的大小为LIST_INIT_SIZEcout<<"                   构造成功!"<<endl;return OK;}

顺序表的销毁:

Status DestoryList(SqList &L){if(L.elem) free(L.elem); //释放掉基址,就销毁了整个表cout<<"                   销毁成功!"<<endl;return OK;}
注意:由于是顺序表,内存是连续的,所以只需要释放的基址,整个表就都销毁了

链表的清空:

Status ClearList(SqList &L){if (L.length != 0){L.length = 0;cout<<"                 顺序表清空成功!"<<endl;return OK;}else {cout<<"                  顺序表没有值!"<<endl;return OK;}}
注意:区分链表的清空与销毁,销毁时链表的内存空间被释放,清空只是清除了链表的值,内存依然在。

判断链表是否为空:

Status ListEmpty(SqList &L){if (L.length == 0)//只需要判断链表长度是否为0{cout<<"该线性表为空"<<endl;return OK;}else cout<<"该线性表不为空"<<endl; return FALSE; }
求表中的元素个数:

Status ListLength(SqList &L){if (L.elem){cout<<"元素个数为:"<<L.length<<endl;return OK;}else{cout<<"线性表不存在!"<<endl;return FALSE;}}

注意:考虑问题要周全,先判断顺序表是否存在,其实也不一定,毕竟前面都已经初始化了

取出顺序表中某一位置的值:

Status GetElem(SqList &L,int &e){int i;if (L.elem&&L.length != 0)//判断线性表是否存在,以及是否有值{cout<<"请选择你要取出线性表的第几个元素:"<<endl;cin>>i;if (i<1||i>L.length){cout<<"输入错误"<<endl;}cout<<"线性表的第"<<i<<"个元素的值为:"<<*(L.elem+i-1)<<endl;
e = L.elem[i-1];
return OK;}else{cout<<"线性表不存在或者为空!"<<endl;return FALSE;}}

插入元素:

Status ListInsert(SqList &L,ElemType e,int pos){int j;ElemType *newbase;if (pos<1||pos>=L.length+1)//length+1是表的最后一位{cout<<"位置输入有误"<<endl;return FALSE;}if (L.length >= L.listsize)   //存储空间满了时,先分配内存,在插入数据{newbase = (ElemType *)realloc(L.elem,(L.listsize+INCREMENT)*sizeof(ElemType));if (!newbase){cout<<"增加内存失败!"<<endl;return ERROR;}L.elem = newbase;L.listsize += INCREMENT;//别忘了表的大小改变了}if (pos == L.length+1)//如果插在末尾就不需要移动数据{L.elem[pos] = e;}else{for (j = L.length;j>=pos;j--){L.elem[j+1] = L.elem[j];}L.elem[pos] = value;}L.length++;cout<<"插入成功!"<<endl;return OK;}
注意:这里一定要考虑都顺序表满了的情况

删除数据:

Status DelData(SqList &L){int Position,i;cout<<"请选择你要删除的数据位置:"<<endl;cin>>Position;if (Position<1||Position>L.length){cout<<"输入数据非法"<<endl;return ERROR;}for (i = Position;i < L.length;i++){L.elem[i] = L.elem[i+1]; }L.length--;cout<<"删除成功!"<<endl;return OK;}


查找数据:

Status SearchData(SqList &L)//顺序查找{ElemType Data;int i;cout<<"输入你要查找的数据:"<<endl;cin>>Data;for (i = 0;i<L.length;i++){if (L.elem[i] == Data){cout<<"你查找的数据位于顺序表的第"<<i<<"位(0开始)"<<endl;return OK;}}cout<<"数据不存在"<<endl;return FALSE;}
Status SearchData(SqList &L)//折半查找(二分法){ElemType Data;int i;ElemType low,high,mid;cout<<"输入你要查找的数据:"<<endl;cin>>Data;low = 0;high = L.length-1;while (low<=high)  {mid = (low+high)/2;if (Data>L.ele[mid]){low = mid+1;}else if(Data<L.elem[mid]){high = mid-1;}else{cout<<"数据在"<<mid+1<<"位"<<endl;return OK;}}cout<<"数据不存在"<<endl;return FALSE;}
有关折半查找的方法,我这里不细说,思想就是找到顺序表的中间位置,然后将中间位置的元素与你要查找的元素比较,如果你输入的比中间元素小,就把high置为mid-1,如果输入的比中间值大,就将low置为mid+1.(折半查找只能在元素有序的情况下进行,我这里说的是元素递增的情况)。


差不多就这么多,当然还有一些操作,比如顺序表的排序啊,合并两个顺序表啊等等,我就不一一列举了,代码没有运行过,可能有一些纰漏,只是提供了一个思路,有逻辑不严谨的地方,还望斧正。

每天进步一点点

原创粉丝点击