線性表之鏈表的基本操作

本文主要實現了線性表中順序表的初始化、創建、增加、刪除、修改、清空,判斷表長、判斷表長等基本操作。

主要依據嚴蔚敏版數據結構教材以及王道數據結構考研輔導書。

以下是主要的功能函數:

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個元素的地址

實現界面如圖:

代碼如下(VS2015編譯通過):

#include <iostream>
#include <cstring>
#include <stdlib.h>
#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<n;i++)//前插
	{
		s = new LNode;
		cin >> 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<n;i++) {
		p = new LNode;
		cin >> 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;j<i;j++) {//j從1開始,與第幾個是對應的,跳出條件是當j==i,即找到了第i個位置
		p = p->next;
	}
	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 (i<n&&p->next != 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;
}

請批評指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章