线性表之链表的基本操作

本文主要实现了线性表中顺序表的初始化、创建、增加、删除、修改、清空,判断表长、判断表长等基本操作。

主要依据严蔚敏版数据结构教材以及王道数据结构考研辅导书。

以下是主要的功能函数:

int InitList(LinkList &L);//初始化
bool CreateList(LinkList &L, int n);
int Length(LinkList L);//返回长度信息
bool ListInsert(LinkList &L, int i, ElemType e);//前插
bool ListDelete(LinkList &L, int i, ElemType &e);//删除
int LocateElem(LinkList L, ElemType e); //查找值为e的第一个元素的位置
ElemType GetElem(LinkList L, int i);//获取第i个位置的值
void PrintList(LinkList L);//输出操作
bool Empty(LinkList L);//判空
void Clear(LinkList &L);//清空操作,表结构依然存在
LinkList FindN(LinkList L, int n);//定位第n个元素的地址

实现界面如图:

线性表之链表的基本操作_第1张图片

代码如下(VS2015编译通过):

#include 
#include 
#include 
#define ElemType int
using namespace std;
typedef struct LNode {
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;
//用LNode *p相当于创建了链表中的一个结点,用指针p指向他
//而LinkList L相当于创建了表L的头指针L(一般都特指这种情况)
/*-----------------------------基本函数-------------------*/
int InitList(LinkList &L);//初始化
bool CreateList(LinkList &L, int n);
int Length(LinkList L);//返回长度信息
bool ListInsert(LinkList &L, int i, ElemType e);//前插
bool ListDelete(LinkList &L, int i, ElemType &e);//删除
int LocateElem(LinkList L, ElemType e); //查找值为e的第一个元素的位置
ElemType GetElem(LinkList L, int i);//获取第i个位置的值
void PrintList(LinkList L);//输出操作
bool Empty(LinkList L);//判空
void Clear(LinkList &L);//清空操作,表结构依然存在
LinkList FindN(LinkList L, int n);//定位第n个元素的地址
/*-----------功能性函数--------------------*/
bool Create(LinkList &L);//创建表
void Insert(LinkList &L);//插入
void Delete(LinkList &L);//删除
void Search(LinkList L);//查询
void showLength(LinkList L);//显示长度
void isEmpty(LinkList L);//判断是否为空
//void shuchuN(LinkList L);
void menu();
void menu() {
	cout << "********1.创建    2.插入*********" << endl;
	cout << "********3.删除    4.查找*********" << endl;
	cout << "********5.输出    6.求表长*********" << endl;
	cout << "********7.判表空  8.清空***********" << endl;
	cout << "********9.退出********************" << endl;
}
int main() {
	LinkList L;
	int choice;
	InitList(L);
	while (1)
	{
		menu();
		cout << "请输入菜单序号:" << endl;
		cin >> choice;
		if (choice == 9) break;
		switch (choice)
		{
		case 1:Create(L);break;
		case 2:Insert(L);break;
		case 3:Delete(L);break;
		case 4:Search(L);break;
		case 5:PrintList(L);break;
		case 6:showLength(L);break;
		case 7:isEmpty(L);break;
		case 8:Clear(L);break;
		default:cout << "输入错误!!!" << endl;
		}
	}
	return 0;
}
int InitList(LinkList &L) {//有头结点
	L = new LNode;//用LNode相当于创建了链表中的一个结点,用new创建,要用delete释放,用malloc创建,用free释放
	L->next = NULL;//这个==就很难受了
	return 0;
}
bool CreateList(LinkList &L, int n) {
	//L=L->next;
	LNode *s;
	for (int i = 0;i> s->data;
		s->next = L->next;
		L->next = s;
	}
	return true;
}
bool CreateList2(LinkList &L, int n) {//后插,L不动,用一个r指针来记录表尾指针,每次在r之后插入新元素
	LNode *r = new LNode;
	r = L;
	LNode *p;
	for (int i = 0;i> p->data;
		p->next = NULL;
		r->next = p;
		r = p;
	}
	return true;

}
int Length(LinkList L) {
	LNode *p = new LNode;
	p = L->next;
	int i = 0;
	while (p) {
		i++;
		p = p->next;
	}
	return i;
}
bool ListInsert(LinkList &L, int n, ElemType e) {//插入
	if (n<1 || n>Length(L) + 1)//判断插入位置是否合法
		return false;
	LNode *s = new LNode;
	LNode *p = new LNode;
	s->data = e;
	p=FindN(L,n-1);//找到第n-1个结点的位置
	s->next = p->next;
	p->next = s;
	return true;
}
bool ListDelete(LinkList &L, int n, ElemType &e) {
	if (n<1 || n>Length(L))
		return false;
	LNode *s = new LNode;
	LNode *p = new LNode;
	p=FindN(L,n-1);//找到第n-1个结点的位置
	s = p->next;
	p->next = s->next;
	delete(s);
	return true;
}
int LocateElem(LinkList L, ElemType e) {
	LNode *p = new LNode;
	p = L->next;
	int i = 0;
	// p=p->next;
	while (p->next&&p->data != e) {//如果p的下一个结点不为空,且当前结点的值不为要找的值
								   //跳出条件:p的下一个结点为空,或者当前结点为要找的值
		p = p->next;
		i++;
	}
	if (p->data == e)//判断当前节点的值是否是要找的值
		return i + 1;
	else//否则,到了链表结尾
		return 0;
}
ElemType GetElem(LinkList L, int i) {
	LNode *p = new LNode;
	p = L->next;//这里指的本就是头结点的下一个结点
	for (int j = 1;jnext;
	}
	return p->data;
}
void PrintList(LinkList L) {
	LinkList p = L;
	p = p->next;
	cout << "表中各个元素为:";
	while (p) {
		cout << p->data << "  ";
		p = p->next;
	}
	cout << endl;
}
bool Empty(LinkList L) {
	if (Length(L) == 0)
		return true;
	else
		return false;
}
void Clear(LinkList &L) {
	LNode *p = new LNode;
	p = L->next;
	LNode *s;//仅为指针类型,不分配空间
	while (p->next)
	{
		s = p;
		p = p->next;
		delete s;
	}
	delete p;
	L->next = NULL;
}
LinkList FindN(LinkList L, int n) {
	LNode *p = new LNode;
	p = L;
	int i = 0;
	while (inext != NULL) {
		p = p->next;
		i++;
	}
	return p;
}
/*-----------功能性函数--------------------*/
bool Create(LinkList &L) {
	int choice;
	cout << "1.前插法 2.后插法 3.返回上一步" << endl;
	cout << "请输入你的选择:" << endl;
	cin >> choice;
	int n;
	switch (choice) {
	case 1:
		cout << "请输入要创建的表的长度:" << endl;
		cin >> n;
		cout << "请输入这" << n << "个数(用空格隔开)" << endl;
		if (CreateList(L, n))//判断即调用过
			cout << "创建成功!" << endl;
		break;
	case 2:
		cout << "请输入要创建的表的长度:" << endl;
		cin >> n;
		cout << "请输入这" << n << "个数(用空格隔开)" << endl;
		if (CreateList2(L, n))//判断即调用过
			cout << "创建成功!" << endl;
		break;
	default:
		cout << "输入错误!!!" << endl;
		break;
	}
	return true;
}
void Insert(LinkList &L) {
	int n;
	ElemType e;
	cout << "请输入想要插入的位置:" << endl;
	cin >> n;
	cout << "请输入第" << n << "个位置上的元素的值:" << endl;
	cin >> e;
	ListInsert(L, n, e);

}
void Delete(LinkList &L) {
	int n;
	ElemType e;
	cout << "请输入想删除的元素的位置:" << endl;
	cin >> n;
	ListDelete(L, n, e);
}
void Search(LinkList L) {
	int choice, i;
	ElemType e;
	cout << "1.按值查找;2.按序号查找;3.返回上一步" << endl;
	cout << "请输出你选择操作的序号:" << endl;
	cin >> choice;
	switch (choice) {
	case 1:
		cout << "请输入要查找的元素的值:";
		cin >> e;
		if (LocateElem(L, e)) {
			cout << "值为" << e << "的元素在第" << LocateElem(L, e) << "个位置" << endl;
		}
		else {
			cout << "找不到!!!" << endl;
		}
		break;
	case 2:
		cout << "请输入要查找的元素的序号:";
		cin >> i;
		if (i<1 || i>Length(L)) {
			cout << "输入有误!" << endl;
			break;
		}
		if (GetElem(L, i))
			cout << "第" << i << "个位置上的元素是" << GetElem(L, i) << endl;
		else {
			cout << "找不到!!!" << endl;
		}
		break;
	case 3:
		break;
	default:
		cout << "输入有误!" << endl;
		break;
	}
}
void showLength(LinkList L) {
	cout << "表当前长度为:" << Length(L) << endl;
}
void isEmpty(LinkList L) {
	if (Empty(L))
		cout << "表为空" << endl;
	else
		cout << "表非空" << endl;
}

请批评指正!

你可能感兴趣的:(考研准备之数据结构)