链表的实现1.0版本c++
是一些基本的链表实现,其中包含创建、插入、删除删除连在一起的相同结点。很多地方省略了对空链表的讨论,记得理解头节点的存在对于链表的影响。(ps:只是自己的学习记录)
代码如下
#include <iostream>
using namespace std;
#define Node elemtype
class Node {
public:
int data;
Node * next;
};
class LinkList
{
public:
LinkList();
~LinkList();
void CreateList(int i);
int Getlength();
void Insertelem(int n,int e);
void Deleteelem(int m);
void Deletesame();
void Display();
private:
int length;
Node* head;
};
LinkList::LinkList()
{
head = new elemtype;
head->next = NULL;
length = 0;
}
LinkList::~LinkList()
{
delete head;
}
void LinkList::CreateList(int i)
{
int n;
Node *p=head,*s;
if (i< 0)
{
cout << "The number is wrong!" << endl;
exit(EXIT_FAILURE);
}
for (n = 0; n < i; n++)
{
s = new elemtype;
cout << "Please enter the " << n +1<< " data" << endl;
cin >> s->data;
s->next = NULL;
p->next = s;
p = s;
}
length = n;
}
void LinkList::Deleteelem(int m)
{
if (m > length)
{
cout << "The input is wrong!" <<endl;
exit(EXIT_FAILURE);
}
Node* p = head, *s;
s = new elemtype;
int i;
for (i = 1; i < m; i++)
{
p = p->next;
}
s = p->next;
p->next = s->next;
delete s;
length--;
}
void LinkList::Deletesame()
{
Node* p = head->next,*s;
while (p->next)
{
s = p->next;
if (s->data == p->data)
{
p->next = s->next;
free(s);
length--;
continue;
}
else p = p->next;
}
}
//这个函数只能删除1->2->2这种相同项,只要原因是在if和else的条件上。
void LinkList::Insertelem(int n,int e)
{
if (n < 0)
{
cout << "wrong!" << endl;
exit(EXIT_FAILURE);
}
Node* p=head,* s;
int i;
s = new elemtype;
for (i = 1; i < n&&p!=NULL; i++)
{
p = p->next;
}
s->data = e;
s->next = p->next;
p->next = s;
length++;
}
int LinkList::Getlength()
{
return length;
}
void LinkList::Display()
{
Node* p=head->next;
int i=1;
if (head->next==NULL)
{
cout << "This is a NULL Linklist." << endl;
}
while (p)
{
cout << "This is the " << i << " data: " << p->data << endl;
p = p->next;
i++;
}
}
int main()
{
LinkList L;
L.CreateList(4);
L.Display();
L.Deletesame();
L.Display();
L.Insertelem(2, 3);
L.Display();
L.Deleteelem(1);
L.Display();
cout << L.Getlength() << endl;
}