重温《大话数据结构》笔记一 单链表链式存储结构的操作代码

#include <iostream>
#include <string>
using namespace std;


typedef int ElemType;
//单链表的链式存储结构
typedef struct Node{
	ElemType data;  //数据域
	Node *next;  //指针域
}Node;
typedef Node* LinkList;

//线性表的类型操作(operation)
void InitList(LinkList *L);  //初始化操作,创建一个空的线性表L
bool ListEmpty(LinkList L);  //判断线性表是否为空,是则返回true,否则返回false
void ClearList(LinkList *L);  //将线性表清空
bool GetElem(LinkList L, int index, ElemType *returnVal);  //将线性表L中的第index位置的元素值返回给returnVal
bool LocateElem(LinkList L, ElemType val);  //查找线性表L中是否有与val值相等的元素
bool ListInsert(LinkList *L, int index, ElemType insertVal);  //在线性表的第index位置插入元素insertVal
bool ListDelete(LinkList *L, int index, ElemType *returnVal);  //删除线性表L中第index位置的元素,将删除元素返回给returnVal
size_t ListLenght(LinkList L);  //返回线性表L的元素个数

//初始化操作,创建一个空的线性表L
void InitList(LinkList *L)
{
	*L = new Node;  //new一个Node结点,为头结点
	(*L)->data = 0;  //头结点的数据域存放的是线性表的长度(这样ListLength函数可以直接访问头结点即可)
	(*L)->next = NULL;  //头指针的指针域为NULL
}

//判断线性表是否为空,是则返回true,否则返回false
bool ListEmpty(LinkList L)
{
	if(L->next == NULL)  //如果头结点的指针域为空,则线性表为空
		return true;
	return false;  //否则线性表不为空
	/*方法二:访问头结点数据域
	if(L->data == 0)
		return true;
	return false;
	*/
}

//将线性表清空
void ClearList(LinkList *L)
{
	(*L)->next = NULL;
	(*L)->data = 0;
}

//在线性表的第index位置插入元素insertVal
bool ListInsert(LinkList *L, int index, ElemType insertVal)
{
	LinkList ptr = *L;
	int tracker = 1;
	while(ptr && tracker < index)
	{
		ptr = ptr->next;
		++tracker;
	}
	if(!ptr || tracker > index)
		return false;
	LinkList newNode = new Node;
	newNode->data = insertVal;
	newNode->next = ptr->next;
	ptr->next = newNode;
	(*L)->data = (*L)->data + 1;  //头结点数据域增1
	return true;
}

//返回线性表L的元素个数
size_t ListLenght(LinkList L)
{
	return L->data;
	/*方法二:迭代计算
	*/
}

//将线性表L中的第index位置的元素值返回给returnVal
bool GetElem(LinkList L, int index, ElemType *returnVal)
{
	LinkList ptr = L->next;
	int tracker = 1;  //ptr指向第tracker个元素
	while(ptr && tracker < index)
	{
		ptr = ptr->next;
		++tracker;
	}
	if(!ptr || tracker > index)
		return false;
	*returnVal = ptr->data;
	return true;
}

//删除线性表L中第index位置的元素,将删除元素返回给returnVal
bool ListDelete(LinkList *L, int index, ElemType *returnVal)
{
	LinkList ptr = *L;
	int tracker = 1;
	while(ptr->next && tracker < index)
	{
		ptr = ptr->next;
		++tracker;
	}
	if(!(ptr->next) || tracker > index)
		return false;
	LinkList deleteNode = ptr->next;
	*returnVal = deleteNode->data;
	ptr->next = deleteNode->next;
	delete deleteNode;
	(*L)->data = (*L)->data - 1;
	return true;
}

//查找线性表L中是否有与val值相等的元素
bool LocateElem(LinkList L, ElemType val)
{
	LinkList ptr = L->next;
	int tracker = 1;
	while(ptr)
	{
		if(ptr->data == val)
			return true;
		ptr = ptr->next;
	}
	if(!ptr)
		return false;  //如果已经到达了结尾
}

void main()
{
	LinkList L;
	InitList(&L);
	cout<<ListEmpty(L)<<endl;

	for(int i = 1; i <= 10; ++i)
		ListInsert(&L, i, i);

	cout<<ListEmpty(L)<<endl;
	cout<<"线性表的元素个数为: "<<ListLenght(L)<<endl;

	cout<<"线性表的全部元素如下: "<<endl;
	ElemType returnVal;
	for(int i = 1; i <= 10; ++i)
	{
		GetElem(L, i, &returnVal);
		cout<<returnVal<<"  ";
	}
	cout<<endl;

	
	cout<<"是否存在元素值为11? "<<LocateElem(L, 11)<<endl;

	ListDelete(&L, 5, &returnVal);
	for(size_t i = 1; i <= ListLenght(L); ++i)
	{
		GetElem(L, i, &returnVal);
		cout<<returnVal<<"  ";
	}
	cout<<endl;

	system("pause");
}

发布了68 篇原创文章 · 获赞 42 · 访问量 22万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章