#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");
}
重溫《大話數據結構》筆記一 單鏈錶鏈式存儲結構的操作代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.