#include<iostream>
using namespace std;
typedef int DataType;
class Node {
public:
int data;
Node * next;
};
class LinkList {
public:
LinkList();
~LinkList();
//創建一個單鏈表
void createLinkList(int n);
//遍歷線性鏈表
void travalLinkList();
//獲取鏈表長度
int getLinkListLength();
//判斷單鏈表是否爲空
bool isEmpty();
//尋找鏈表節點
Node *findNode(DataType data);
//尾部插入指定值
void insertLinkListAtEnd(DataType data);
//在指定位置插入值
void insertLinkListAtIndex(DataType data, int index);
//在頭部插入數值
void insertLinkListAtHead(DataType data);
//刪除尾部數據庫
void deleteLinkListAtEnd();
//刪除所有數據
void deleteLinkListAll();
//刪除指定數據
void deleteLinkListAtPoint(DataType data);
//在指定位置刪除數據
void deleteLinkListAtIndex(int index);
//刪除頭部位置的數據
void deleteLinkListAtHead();
//翻轉鏈表所有的數據
void reverseLinkList();
private:
Node * head;
};
LinkList::LinkList() {
head = new Node;
head->data = 0;
head->next = NULL;
}
LinkList::~LinkList() {
delete head;
}
void LinkList::createLinkList(int n) {
Node *pnew, *ptemp;
ptemp = head;
if (n < 0) {
cout << "輸入的節點個數有誤" << endl;
exit(EXIT_FAILURE);
}
for (int i = 0; i < n; i++) {
pnew = new Node;
cout << "請輸入第" << i + 1 << "個值: ";
cin >> pnew->data;
pnew->next = NULL;
ptemp->next = pnew;
ptemp = pnew;
}
}
void LinkList::travalLinkList() {
if (head == NULL || head->next == NULL) {
cout << "鏈表爲空表" << endl;
}
Node *ptemp = head;
while (ptemp->next != NULL) {
ptemp = ptemp->next;
cout << ptemp->data << " ";
}
cout << endl;
}
//獲取鏈表的長度
int LinkList::getLinkListLength() {
int count = 0;
Node *ptemp = head;
while (ptemp->next != NULL) {
ptemp = ptemp->next;
count++;
}
return count;
}
//判斷鏈表是否爲空
bool LinkList::isEmpty() {
if (head->next == NULL) {
return true;
}
return false;
}
Node* LinkList::findNode(DataType data) {
Node *ptemp = head;
if (ptemp == NULL) {
cout << "此鏈表爲空鏈表" << endl;
return NULL;
}
while (ptemp->next != NULL)
{
if (ptemp->data == data) {
return ptemp;
}
ptemp = ptemp->next;
}
return NULL;
}
//在鏈表尾部插入數據
void LinkList::insertLinkListAtEnd(DataType data) {
Node *newNode = new Node;
newNode->data = data;
newNode->next = NULL;
Node *ptemp = head;
if (head == NULL) {
head = newNode;
}
else {
while (ptemp->next != NULL)
{
ptemp = ptemp->next;
}
ptemp->next = newNode;
}
}
//在鏈表指定位置插入數據
void LinkList::insertLinkListAtIndex(DataType data, int index) {
if (index < 1 || index> getLinkListLength()){
cout << "輸入的值錯誤" << endl;
}
Node * newNode = new Node;
newNode->data = data;
newNode->next = NULL;
Node *ptemp = head;
int i = 1;
while (i < index) {
ptemp = ptemp->next;
i++;
}
newNode->next = ptemp->next;
ptemp->next = newNode;
}
//在鏈表頭部後面插入數據
void LinkList::insertLinkListAtHead(DataType data) {
Node *newNode = new Node;
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
}
Node *ptemp = head;
newNode->next = ptemp->next;
ptemp->next = newNode;
}
//在尾部刪除數據
void LinkList::deleteLinkListAtEnd() {
Node *p = head;
Node *ptemp = NULL;
if (p == NULL || p->next == NULL) {
cout << "單鏈表空" << endl;
}
else {
while (p->next != NULL) {
ptemp = p;
p = p->next;
}
delete p;
p = NULL;
ptemp->next = NULL;
}
}
//刪除所有的數據
void LinkList::deleteLinkListAll(){
Node * p = head->next;
Node *ptemp = new Node;
while (p != NULL){
ptemp = p;
p = p->next;
head->next = p;
ptemp->next = NULL;
delete ptemp;
}
head->next = NULL;
}
//刪除指定數據
void LinkList::deleteLinkListAtPoint(DataType data){
Node *ptemp = findNode(data);
if (ptemp == head->next){
deleteLinkListAll();
}
else{
Node *p = head;
while (p->next != ptemp)
{
p = p->next;
}
p->next = ptemp->next;
delete ptemp;
ptemp = NULL;
}
}
//在頭部刪除數據
void LinkList::deleteLinkListAtHead(){
Node *p = head;
if (p == NULL || p->next == NULL){
cout << "該鏈表爲空表" << endl;
}
else{
Node *ptemp = NULL;
p = p->next;
ptemp = p->next;
delete p;
p = NULL;
head->next = ptemp;
}
}
//在指定位置刪除數據
void LinkList::deleteLinkListAtIndex(int index){
if (index <1 || index > getLinkListLength()){
cout << "輸入的刪除位置錯誤" << endl;
}
Node *p = head;
if (p ==NULL || p->next == NULL){
cout << "鏈表爲空" << endl;
}
int i = 0;
Node *ptemp = NULL;
while (i < index) {
ptemp = p;
p = p->next;
i++;
}
ptemp->next = p->next;
delete p;
p = NULL;
}
/*
//翻轉鏈表
Node* LinkList::reverseLinkList(){
Node *p = head;
if (p == NULL || p->next == NULL){
cout << "鏈表爲空" << endl;
}
Node *reverseList = new Node;
reverseList->next = NULL;
reverseList->data = 0;
Node *ptemp = NULL;
while (p != NULL){
ptemp = p->next;
//reverseList前插入數據
p->next = reverseList->next;
reverseList->next = p;
p = ptemp;
}
return reverseList;
}
*/
int main(){
LinkList linklist = LinkList();
int i;
cout << "1.創建單鏈表 2.遍歷單鏈表\n";
cout << "3.獲取單鏈表的長度 4.判斷單鏈表是否爲空\n";
cout << "5.獲取節點 6.在尾部插入指定元素\n";
cout << "7.在指定位置插入指定元素 8.在頭部插入指定元素\n";
cout << "9.在尾部刪除元素 10.刪除所有元素\n";
cout << "11.刪除指定元素 12.在頭部刪除元素\n";
cout << "13.刪除指定位置的數據 0.退出" << endl;
do{
cout << "請輸入要執行的操作: ";
cin >> i;
switch (i)
{
case 1:
int n;
cout << "請輸入鏈表的長度" << endl;
cin >> n;
linklist.createLinkList(n);
break;
case 2:
linklist.travalLinkList();
break;
case 3:
cout << "鏈表的長度:" << linklist.getLinkListLength() << endl;
break;
case 4:
if (linklist.isEmpty()){
cout << "該單鏈表是空表" << endl;
}
else
{
cout << "該單鏈表不是空表" << endl;
}
break;
case 5:
int data;
cout << "請輸入要獲取節點的值: ";
cin >> data;
cout << "該節點的值爲:" << linklist.findNode(data)->data << endl;
break;
case 6:
int endData;
cout << "請輸入要在尾部插入的值: ";
cin >> endData;
linklist.insertLinkListAtEnd(endData);
break;
case 7:
DataType pointData;
int index;
cout << "請輸出要插入的值" << endl;
cin >> pointData;
cout << "請輸出要插入值的位置" << endl;
cin >> index;
linklist.insertLinkListAtIndex(pointData, index);
break;
case 8:
DataType headData;
cout << "請輸出在頭部要插入的值" << endl;
cin >> headData;
linklist.insertLinkListAtHead(headData);
break;
case 9:
linklist.deleteLinkListAtEnd();
cout << "尾部刪除數據操作完成"<< endl;
break;
case 10:
linklist.deleteLinkListAll();
cout << "刪除所有數據操作完成" << endl;
break;
case 11:
DataType pointDeleteData;
cout << "請輸出要刪除的指定值" << endl;
cin >> pointDeleteData;
linklist.deleteLinkListAtPoint(pointDeleteData);
break;
case 12:
linklist.deleteLinkListAtHead();
cout << "刪除頭部數據操作完成" << endl;
break;
case 13:
int deleteIndex;
cout << "請輸出要刪除值的位置" << endl;
cin >> deleteIndex;
linklist.deleteLinkListAtIndex(deleteIndex);
break;
default:
break;
}
} while (i != 0);
system("pause");
return 0;
}
C++單鏈表增刪查找的基本操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.