链表基本概念(先弄清楚概念才能写出代码):
链表是一种常见的数据结构,我们经常会使用数组来存放数据,但使用数组时,要先指定数组的大小,如果向这个数组加入过多的元素,则会超出,导致无法保存数据;如果数据太小,又会非常浪费内存空间。
所以,我们希望有一种存储方式,其储存的元素个数是不受限定的,当进行添加元素时,存储的个数也会增加,这种储存方式就是链表。
在链表中,有一个头指针head变量,用这个指针变量保存第一个元素的地址,其中,这个元素包括两个部分:数据部分和指针部分。数据部分用来存放元素的数据,指针部分用来指向下一个元素。于是,头指针指向第一个元素,第一个元素中的指针又指向第二个元素,第二个元素中的指针又指向第三个元素,依次下去,到了最后一个元素的指针就指向Null,表示指向的地址为空。
头指针:head
头结点:在单链表的第一个结点之前附设的一个结点。他的数据域可以不存储任何信息,也可以存储如线性表的长度等类的附加信息。头结点的指针域指向首元结点。并且头结点不计入链表的长度。
首元结点:指链表中用来存储数据元素的结点中的第一个结点。
作用:允许在任意位置插入和删除结点,插入删除快速,当需要多次插入删除时。
实现动态链表
结点声明
template<class elemtype>
struct node
{
elemtype data;
node<elemtype>* next;
};
单链表类模板
template<class elemtype>
class linklist
{
public:
linklist();
void insert(int i, elemtype x);
int length();
void printlist();
elemtype get(int i);
~linklist();
private:
node<elemtype>* head;
};
各类函数实现
//创建操作
template<class elemtype>
linklist<elemtype>::linklist()
{
head = new node<elemtype>;
head->next = NULL;
}
//插入操做
template<class elemtype>
void linklist<elemtype>::insert(int i, elemtype x)
{
node<elemtype>* p = head;
int count = 0;
while (count<i-1&&p!=NULL)
{
p = p->next;
count++;
}
if (p != NULL)
{
node<elemtype>* s = new node<elemtype>;
s->data = x;
s->next = p->next;
p->next = s;
}
}
//返回长度
template<class elemtype>
int linklist<elemtype>::length()
{
node<elemtype>* p = head->next;
int count = 1;
while (p->next != NULL)
{
p = p->next;
count++;
}
return count;
}
//打印
template<class elemtype>
void linklist<elemtype>::printlist()
{
node<elemtype>* p = head->next;
while (p != NULL)
{
cout << p->data<<" ";
p = p->next;
}
}
//获取下标
template<class elemtype>
elemtype linklist<elemtype>::get(int i)
{
node<elemtype>* p = head->next;
int count = 1;
while (count < i && p != NULL)
{
p = p->next;
count++;
}
if (p != NULL)
return p->data;
else
cout << "参数非法" << endl;
}
//析构函数
template<class elemtype>
linklist<elemtype>::~linklist()
{
while (head != NULL)
{
node<elemtype>* p = head;
head = head->next;
delete p;
}
}
单链表模板
//结点
template<class elemtype>
struct node
{
elemtype data;
node<elemtype>* next;
};
//类模板
template<class elemtype>
class linklist
{
public:
linklist();
void insert(int i, elemtype x);//第i位置插入x
int length();//返回链表长度
void printlist();//打印链表
elemtype get(int i);//下标获取
void Delete(int i);//删除第i个结点
~linklist();
private:
node<elemtype>* head;
};
//创建操作
template<class elemtype>
linklist<elemtype>::linklist()
{
head = new node<elemtype>;
head->next = NULL;
}
//插入操做
template<class elemtype>
void linklist<elemtype>::insert(int i, elemtype x)
{
node<elemtype>* p = head;
int count = 0;
while (count < i - 1 && p != NULL)
{
p = p->next;
count++;
}
if (p != NULL)
{
node<elemtype>* s = new node<elemtype>;
s->data = x;
s->next = p->next;
p->next = s;
}
}
//返回长度
template<class elemtype>
int linklist<elemtype>::length()
{
node<elemtype>* p = head->next;
int count = 1;
while (p->next != NULL)
{
p = p->next;
count++;
}
return count;
}
//打印
template<class elemtype>
void linklist<elemtype>::printlist()
{
node<elemtype>* p = head->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
//获取下标
template<class elemtype>
elemtype linklist<elemtype>::get(int i)
{
node<elemtype>* p = head->next;
int count = 1;
while (count < i && p != NULL)
{
p = p->next;
count++;
}
if (p != NULL)
return p->data;
else
cout << "参数非法" << endl;
}
template<class elemtype>
void linklist<elemtype>::Delete(int i)
{
node<elemtype>* p = head;
int count = 0;
while (count<i-1&&p!=NULL)
{
p = p->next;
count++;
}
if (p != NULL && p->next != NULL)
{
node<elemtype> *q = p->next;
p->next = q->next;
delete q;
}
}
//析构函数
template<class elemtype>
linklist<elemtype>::~linklist()
{
while (head != NULL)
{
node<elemtype>* p = head;
head = head->next;
delete p;
}
}