#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");
}
重温《大话数据结构》笔记一 单链表链式存储结构的操作代码
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.