带头结点的单向链表
#include<iostream>
using namespace std;
//实例化对象充当头节点,一个对象为一条单向链表
class LinkList
{
private:
int data;
LinkList* next;
public:
LinkList(int x = 0) :data(x), next(NULL) {}
void HeadPushList(int x); //增-头插
void TailPushList(int x); //增-尾插
void RandInsertList(int n, int x); //增-在第n个位置前插入数据x
int HeadPopList(); //删-头删,返回删除数据
int TailPopList(); //删-尾删,返回删除数据
int RandDeleteList(int n); //删-删除第n个数,返回删除数据
int DataSearchList(int n); //查找第n个数据的值
int LocateSearchList(int x); //查-查找元素x在结构中首次出现的位置
LinkList& AllLocateSearchList(int x); //查-查找元素x在结构中出现的次数以及所有位置
bool LocateChangeList(int n, int x); //改-将第n个位置上的数据改为x
bool DataChangeList(int x, int y); //改-将数据表中所有的数据x改为y
void ListShow(); //打印
inline bool EmptyList(); //判断结构是否为空
};
//头插
void LinkList::HeadPushList(int x)
{
if (data == 0)
{
LinkList* p = new LinkList(x);
next = p;
data++;
}
else
{
LinkList* p = new LinkList(x);
p->next = next;
next = p;
data++;
}
}
//尾插
void LinkList::TailPushList(int x)
{
if (data == 0)
HeadPushList(x);
else
{
LinkList* p = new LinkList(x);
LinkList* temp = next;
while (temp->next != NULL)
temp = temp->next;
temp->next = p;
data++;
}
}
//在第n个位置前插入数据x
void LinkList::RandInsertList(int n, int x)
{
if (n == 1)
{
HeadPushList(x);
}
else if (n > 1 && n <= data)
{
LinkList* p = new LinkList(x);
LinkList* temp = next;
int count = n - 2;
while (count--)
{
temp = temp->next;
}
p->next = temp->next;
temp->next = p;
data++;
}
else
{
cout << "插入失败!\n原因:插入位置错误!" << endl;
}
}
//头删,返回删除数据
int LinkList::HeadPopList()
{
if (data == 0)
cout << "该结构中无数据!" << endl;
else
{
LinkList* temp = next;
int x = temp->data;
next = next->next;
delete temp;
data--;
return x;
}
return NULL;
}
//尾删,返回删除数据
int LinkList::TailPopList()
{
int x;
if (data == 0)
cout << "该结构中无数据!" << endl;
else if (data == 1)
{
x = HeadPopList();
return x;
}
else
{
LinkList* temp = next;
while (temp->next->next != NULL)
temp = temp->next;
x = temp->next->data;
delete temp->next;
temp->next = NULL;
data--;
return x;
}
return NULL;
}
//删除第n个数,返回删除数据
int LinkList::RandDeleteList(int n)
{
int x;
if (data == 0)
return NULL;
if (n == 1)
{
x = HeadPopList();
}
else if (n == data)
{
x = TailPopList();
}
else if (n > 1 && n < data)
{
int cnt = n - 2;
LinkList* p = next;
while (cnt--)
p = p->next;
LinkList* p1 = p->next;
x = p1->data;
p->next = p1->next;
delete p1;
data--;
}
else
{
cout << "删除位置错误!";
return NULL;
}
cout << "删除成功!" << endl;
return x;
}
//查找第n个数据的值
int LinkList::DataSearchList(int n)
{
if (EmptyList() || (!(n > 0 && n <= data)))
return false;
LinkList* p = next;
int index = n - 1;
while (index--)
p = p->next;
return p->data;
}
//查找元素x在结构中首次出现的位置
int LinkList::LocateSearchList(int x)
{
int index = 1;
LinkList* p = next;
while (p != NULL)
{
if (p->data == x)
return index;
p = p->next;
index++;
}
cout << "该结构中未找到数据" << x << endl;
return NULL;
}
//查找元素x在结构中出现的所有位置
LinkList& LinkList::AllLocateSearchList(int x)
{
LinkList L;
LinkList* p = next;
int index = 0;
while (p != NULL)
{
index++;
if (p->data == x)
L.TailPushList(index);
p = p->next;
}
return L;
}
//改-将第n个位置上的数据改为x
bool LinkList::LocateChangeList(int n, int x)
{
if (EmptyList()||(!(n > 0 && n <= data)))
return false;
int index = n - 1;
LinkList* p = next;
while (index--)
p = p->next;
p->data = x;
return true;
}
//改-将数据表中所有的数据x改为y
bool LinkList::DataChangeList(int x, int y)
{
LinkList Location = AllLocateSearchList(x);
if (Location.EmptyList())
return false;
LinkList* p = Location.next;
while (p != NULL)
{
LocateChangeList(p->data, y);
p = p->next;
}
return true;
}
//打印
void LinkList::ListShow()
{
if (data == 0)
{
cout << "该结构中没有数据!" << endl;
}
else
{
LinkList* temp = next;
cout << "该结构中共有" << data << "个数据:\n";
while (temp->next != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
cout << temp->data << " ";
}
}
//判断结构是否为空
bool LinkList::EmptyList()
{
if (data == 0)
return true;
return false;
}
int main()
{
int x;
LinkList L;
L.TailPushList(1);
L.TailPushList(2);
L.TailPushList(1);
L.TailPushList(4);
L.TailPushList(1);
L.DataChangeList(1, 8);
L.ListShow();
return 0;
}