顺序表的十几种基本操作(详细)的代码(经过编译)

通过本次写顺序表的基本操作,又提高了我对指针的认知。
关于在main函数中定义SqList *pL;和定义SqList pL;的差别:*
定义SqList *pL;//第一次试验时,没有给pL分配存储空间,结果编译没问题,运行就出现了错误,这是因为没有初始化指针就已经使用指针的原因。
还有就是,如果这样定义,调用pL里面的值时需要用"->“来调用。
定义SqList pL;//如果这样定义,调用pL里面的值时需要用”."来调用。

关于在自定义函数名中定义形参SqList *L和SqList &L的差别:*
一个是指针,一个是引用,两者最大的却别就是一个分配内存,另一个不分配,指针要分配内存存放变量的地址,引用就是变量的一个别名。
SqList 是一个结构体,SqList *L 表示定义了一个指向SqList类型的指针,&L 表示L的指针,L->num[]这儿的L定义为:SqList *L,而L.num[]这儿的L定义为struct SqList L。**当L定义为SqList *L时,L->num[]等同于(*L).num[],只是前者书写更方便 **

当在main函数中使用SqList pL;时:
内存就会自动给pL分配存储空间,所以"L.elem == NULL"不会为真,即"!L.elem "不会为真,这样程序不需要初始化一个顺序表就能进行其他操作了,需要我们手动定义 “L.elem==NULL”。

关于"if(L.elem == NULL)"不起作用的问题
定义指针的时候必须给指针初始化(以防指针空间的数据没有及时清空),用free§释放掉指针所指的内存空间后,必须立即同时把p赋值为NULL,避免后面程序指针P而导致意想不到的错误,甚至系统崩溃!

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
using namespace std;


#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0

typedef int EleType;

/*定义顺序表类型定义*/
typedef struct SqList {
	EleType *elem;
	int length ;    //当前链表的长度
	int listsize;   //当前链表分配的存储容量
} SqList;

/*初始化一个空的线性表L*/
int InitList_Sq(SqList &L) {
	L.elem=(EleType *)malloc(sizeof(EleType));
	if(! L.elem) exit(OVERFLOW);
	L.length=0;           			//空表的长度为0
	L.listsize=LIST_INIT_SIZE; 	//分配给空表的存储容量
	return OK;
}

/*销毁线性表*/
int DestroyList_Sq(SqList &L) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		free(L.elem);
		L.elem = NULL;
		L.length=0;
		L.listsize=0;
		cout<<"销毁成功"<<endl;
	}
	return OK;
}

/*清空线性表*/
int ClearList_Sq(SqList &L) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		L.length=0;
		cout<<"清空成功"<<endl;
	}
	return OK;
}

/*判断线性表是否为空*/
int ListEmpty_Sq(SqList &L) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		if(L.length==0) {
			cout<<"该线性表是空的!"<<endl;
			return TRUE;
		} else {
			cout<<"该线性表不是空的!"<<endl;
			return FALSE;
		}
	}
}

/*求线性表长度*/
int ListLength_Sq(SqList &L) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		cout<<"该线性表长度为:"<<L.length<<endl;
		return 0;
	}
}

/*查找线性表中第一个与所给数据匹配的数据元素的位置*/
int LocateElem( SqList L, EleType e) {
	int i=0;
	while(i<L.length)
		if (L.elem[i++]==e) return i;
	return 0;
}

/*求前驱*/
int PriorElem_Sq(SqList L,EleType cur_e,EleType *pre_e) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		int a;
		a=LocateElem(L,cur_e);
		//	cout<<a<<endl;
		if(a==1) {
			cout<<"元素"<<cur_e<<"没有前驱!"<<endl;
			return OVERFLOW;
		}
		else if(a==0){
			cout<<"元素"<<cur_e<<"不存在!"<<endl;
			return OVERFLOW;
		}
		else{
			*pre_e=L.elem[a-2];
			cout<<"元素"<<cur_e<<"的前驱为:"<<*pre_e<<endl;
		}
	}
	return OK;
}

/*求后继*/
int NextElem_Sq(SqList L,EleType cur_e,EleType *next_e) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		int a;
		a=LocateElem(L,cur_e);
		if(a==L.length) {
			cout<<"元素"<<cur_e<<"没有后继!"<<endl;
			return OVERFLOW;
		}
		else if(a==0){
			cout<<"元素"<<cur_e<<"不存在!"<<endl;
			return OVERFLOW;
		}
		else{
			*next_e=L.elem[a];
			cout<<"元素"<<cur_e<<"的后驱为:"<<*next_e<<endl;
			return OK;
		}	
	}
}

/*返回线性表L第i个位置的数据*/
EleType GetElem_Sq(SqList L,int i) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		//检查i的合法性
		if(i<0 || i>L.length) {
			cout<<"位置号非法"<<endl;
			return OVERFLOW;
		} else {
			cout<<"您查询的数据为:"<<L.elem[i-1]<<endl;
			return OK;
		}
	}
}

/*向顺序表L第i个位置插入e*/
int InsList_Sq(SqList *L, int i, EleType e) {
	EleType *p,*q,*newbase;
	//合法性检查1<=i<=*L.length+1
	if(i<1 || i> (L->length+1)) return ERROR;   //i值不合法
	if( L->length>=L->listsize) {       //存储空间已满,需要增加分配的空间
		newbase=(EleType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(EleType));     //再分配LISTINCREMENT个存储空间
		if(!newbase) exit(OVERFLOW);       //存储空间分配失败
		L->elem=newbase;             //新基址
		L->listsize+=LISTINCREMENT;  //分配的存储容量增加
	}

	q=&(L->elem[i-1]);  //确定需要插入的位置
	p=L->elem+L->length-1;//p指向最后一个元素的位置

	for(; p>=q; p--) *(p+1)=*(p); //将插入位置后的数据均向后移一个位置
	*q=e;   //插入e

	L->length++;    //表长加1

	return OK;
}

/*删除顺序表L中第i个位置的数据*/
int DeList_Sq( SqList *L, int i) {
	EleType *p,*q;
	p=&(L->elem[i-1]); //指向链表的第i个位置
	q=L->elem+L->length-1;  //指向表尾元素

	while(p<q) {
		*p=*(p+1);    //i位置后的数据均向前移动一个数据
		p++;
	}
	--L->length;
	return OK;
}

/*遍历顺序表的元素*/
int Print_Sq( SqList L) {
	if(L.elem == NULL) {
		cout<<"线性表不存在!"<<endl;
		return FALSE;
	} else {
		int j;
		cout<<"顺序表为:";
		for(j=1; j<=L.length; j++) cout<<L.elem[j-1]<<" ";
		return OK;
	}
}

int main() {
	//SqList *pL=(SqList *)malloc(sizeof(SqList));//第一次试验时,没有给pL分配存储空间,结果编译没问题,运行就出现了错误,这是因为没有初始化指针就已经使用指针的原因
	//InitList_Sq(pL);
	SqList pL;
	pL.elem = NULL;
	int a,i;
	EleType data,e,pre_e,next_e;
	cout<<"1.----初始化一个线性表"<<endl;
	cout<<"2.----销毁线性表"<<endl;
	cout<<"3.----清空线性表"<<endl;
	cout<<"4.----判断线性表是否为空"<<endl;
	cout<<"5.----求线性表长度"<<endl;
	cout<<"6.----获取线性表指定位置元素"<<endl;
	cout<<"7.----求前驱"<<endl;
	cout<<"8.----求后继"<<endl;
	cout<<"9.----在线性表指定位置插入元素"<<endl;
	cout<<"10.---删除线性表指定位置元素"<<endl;
	cout<<"11.---显示线性表"<<endl;
	cout<<"     退出:输入一个负数!"<<endl;
	cout<<endl<<"请输入操作代码:";
	while((cin>>a)!=0) {
		if(a<0) break;
		else {
			switch(a) {
				case 1:
					InitList_Sq(pL);
					cout<<"创建成功"<<endl;
					cout<<endl<<"请输入操作代码:";
					break;
				case 2:
					DestroyList_Sq(pL);
					cout<<endl<<"请输入操作代码:";
					break;
				case 3:
					ClearList_Sq(pL);
					cout<<endl<<"请输入操作代码:";
					break;
				case 4:
					ListEmpty_Sq(pL);
					cout<<endl<<"请输入操作代码:";
					break;
				case 5:
					ListLength_Sq(pL);
					cout<<endl<<"请输入操作代码:";
					break;
				case 6:
					if(pL.elem == NULL) {
						cout<<"线性表不存在!"<<endl;
						cout<<endl<<"请输入操作代码:";
						break;
					} else {
						cout<<"请输入您需要查询的元素的编号:";
						cin>>i;
						GetElem_Sq(pL,i);
						cout<<endl<<"请输入操作代码:";
						break;
					}
				case 7:
					if(pL.elem == NULL) {
						cout<<"线性表不存在!"<<endl;
						cout<<endl<<"请输入操作代码:";
						break;
					} else {
						cout<<"请输入您需要查询的元素:";
						cin>>i;
						PriorElem_Sq( pL,i,&pre_e);
						cout<<endl<<"请输入操作代码:";
						break;
					}
				case 8:
					if(pL.elem == NULL) {
						cout<<"线性表不存在!"<<endl;
						cout<<endl<<"请输入操作代码:";
						break;
					} else {
						cout<<"请输入您需要查询的元素:";
						cin>>i;
						NextElem_Sq( pL,i,&next_e);
						cout<<endl<<"请输入操作代码:";
						break;
					}
				case 9:
					if(pL.elem == NULL) {
						cout<<"线性表不存在!"<<endl;
						cout<<endl<<"请输入操作代码:";
						break;
					} else {
						cout<<"请输入您需要插入的数据以及它的位置:";
						cin>>data>>i;
						cout<<"您需要插入的数据是:"<<data<<endl;
						cout<<"您要插入的位置是:"<<i<<endl;
						if(InsList_Sq(&pL,i,data))	cout<<"插入成功"<<endl;
						cout<<endl<<"请输入操作代码:";
						break;
					}
				case 10:
					if(pL.elem == NULL) {
						cout<<"线性表不存在!"<<endl;
						cout<<endl<<"请输入操作代码:";
						break;
					} else {
						cout<<endl<<"请输入您需要删除元素的位置:";
						cin>>i;
						cout<<"您要删除的位置是:"<<i<<endl;
						if(DeList_Sq(&pL,i)) cout<<"删除成功"<<endl;
						cout<<"删除后的链表为:"<<endl;
						Print_Sq(pL);
						cout<<endl<<"请输入操作代码:";
						break;
					}
				case 11:
					Print_Sq( pL);
					cout<<endl<<"请输入操作代码:";
					break;
				default:
					cout<<"该数据无效,请重新输入:";
					break;
			}
		}
	}
	return 0;
}

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页