單鏈表操作函式C++實現
阿新 • • 發佈:2018-12-19
最近在學習資料結構的連結串列,剛開始接觸,肯定有某些沒發現的錯誤,歡迎大家指出來。
好了,不說廢話了,直接上程式碼
首先是單鏈表的.H檔案
#pragma once typedef int DataType; #define Node ElemType //定義節點 class Node { public: int value; Node* next; }; //定義單鏈表 class LinkList { public: //構建單鏈表 LinkList(); //銷燬單鏈表 ~LinkList(); //建立一個單鏈表 void CreateLinkList(int n); //遍歷線性表 void TravalLinkList(); //獲取線性表長度 int GetLength(); //判斷單鏈表是否為空 bool IsEmpty(); //查詢節點 ElemType *FindNode(DataType data); //在連結串列尾部插入指定元素 void InsertElemAtEnd(DataType data); //在連結串列指定位置插入指定元素 void InsertElemAtIndex(DataType data, int n); //在連結串列頭部插入指定元素 void InsertElemAtHead(DataType data); //刪除尾部元素 void DeleteElemAtEnd(); //刪除指定元素 void DeleteElemAtIndex(DataType data); //刪除頭部元素 void DeleteElemAtHead(); private: ElemType* head; };
然後是對應的.cpp檔案
#include"ListNode.h" #include<iostream> #define MaxSize 10000 //構建單鏈表 LinkList::LinkList() { head = new ElemType; head->value = 0; head->next = NULL; } //銷燬單鏈表 LinkList::~LinkList() { delete head; } //建立一個單鏈表 void LinkList::CreateLinkList(int n) { ElemType *pnew, *ptemp; ptemp = head; if (n<0 || n>MaxSize) { std::cout << "輸入節點個數有誤" << std::endl; } std::cout << "請依次輸入" << n << "個元素:"; for (int i = 0; i < n; i++) { pnew = new ElemType; std::cin >> pnew->value; pnew->next = NULL; ptemp->next = pnew; ptemp = pnew; } } //遍歷線性表 void LinkList::TravalLinkList() { if (head == NULL || head->next == NULL) { std::cout << "連結串列為空表" << std::endl; } std::cout << "連結串列中的資料依次為:"; ElemType *p = head->next; while (p != NULL) { std::cout << p->value << " "; p = p->next; } } //獲取線性表長度 int LinkList::GetLength() { int count = 0; ElemType *p = head->next; while (p != NULL) { count++; p = p->next; } return count; } //判斷單鏈表是否為空 bool LinkList::IsEmpty() { if (head->next == NULL) return true; else return false; } //查詢節點,在查詢不到該元素時會造成錯誤中斷 ElemType *LinkList::FindNode(DataType data) { ElemType *p = head->next; if (p == NULL) { std::cout << "連結串列為空" << std::endl; return false; } else { while (p != NULL) { if (p->value == data) { return p; } p = p->next; } return NULL; } } //在連結串列尾部插入指定元素 void LinkList::InsertElemAtEnd(DataType data) { ElemType *newNode = new ElemType; newNode->next = NULL; newNode->value = data; ElemType *p = head; if (head->next == NULL) { head->next = newNode; } else { while (p->next != NULL) { p = p->next; } p->next = newNode; } } //在連結串列指定位置插入指定元素 void LinkList::InsertElemAtIndex(DataType data,int n) { if (n<0 || n>GetLength()) { std::cout << "插入位置不合理"<< std::endl; } else { ElemType *newNode = new ElemType; newNode->value = data; ElemType *p = head; int i = 1; while (n > i) { p = p->next; i++; } newNode->next = p->next; p->next = newNode; } } //在連結串列頭部插入指定元素 void LinkList::InsertElemAtHead(DataType data) { ElemType *newNode = new ElemType; newNode->value = data; ElemType *p = head; if (p == NULL) { head->next = newNode; } newNode->next = p->next; p->next = newNode; } //刪除尾部元素 void LinkList::DeleteElemAtEnd() { ElemType *p = head; ElemType *ptemp=NULL; if (head == NULL) { std::cout << "連結串列為空" << std::endl; } else { while (p->next != NULL) { ptemp = p; p = p->next; } delete p; p = NULL; ptemp->next = NULL; } } //刪除指定元素 void LinkList::DeleteElemAtIndex(DataType data) { ElemType *ptemp =FindNode(data); if (ptemp == head->next) { DeleteElemAtHead(); } else { ElemType *p = head; while (p->next != ptemp) { p = p->next; } p->next = ptemp->next; delete ptemp; ptemp = NULL; } } //刪除頭部元素 void LinkList::DeleteElemAtHead() { ElemType *p = head; if (p == NULL || p->next == NULL) { std::cout << "連結串列為空" << std::endl; } else { ElemType *ptemp = NULL; p = p->next; ptemp = p->next; delete p; p = NULL; head->next = ptemp; } }
至於主程式就自己隨意了,因為都是函式,直接呼叫就可以了
注意:
我發現在查詢節點函式.FindNode(data)中,如果查詢不到該元素會返回錯誤造成程式進入中斷,目前能力有限,還不能解決,也希望有了解的小夥伴可以告知一下,非常感謝