链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的。在C语言中,链表是通过指针相关实现的。而单链表是链表的其中一种,关于单链表就是其节点中有数据域和只有一个指向下个节点的指针域。创建单链表的方法有两种,分别是头插法和尾插法。所谓头插法,就是按节点的逆序方法逐渐将结点插入到链表的头部。反之尾插法就是按节点的顺序逐渐将节点插入到链表的尾部。相对来说,头插法要比尾插法算法简单,但是最后产生的链表是逆序的,即第一个输入的节点实际是链表的最后一个节点。而为了习惯,通常用尾插法来创建链表。下面的代码就是实现了头插法和尾插法,元素的插入、删除、查找的一个整体操作。其中查找分为按位置查找。删除和插入都是按给定位置操作。
#include <iostream>using namespace std;
template<class T1>
class linklist
{
public:
linklist()
{
// p = new LNode;
// s = new LNode;
// q = new LNode;
L = new LNode;//申请节点空间
p = new LNode;
if(L == NULL)//判断是否有足够的空间
cout << "申请内存空间失败" <<endl;
L->next = NULL;//将next设置为空,初始化长度
flag = 0;
}
typedef struct LNode
{
T1 data;
struct LNode *next;
}LNode,*Linklist;//Linklist 指向节点的指针
//单链表的建立,头插法建立单链表
Linklist linklistCreatH()
{
while((cin >> data1) && (data1 != 0))//data1终止循环
{
p = new LNode;//关键一步重新分配一个指针节点
p->data = data1;
p->next = L->next;
L->next = p;
}
return L;
}
//单链表的建立,尾插法建立单链表
Linklist linklistCreatF()
{
LNode *r;
r = L;//r始终指向终端节点,开始时指向头结点
while((cin >> data1) && (data1) != 0)
{
p = new LNode;
p->data = data1;
r->next = p;//将节点插入到表头
r = p;
}
r->next = NULL;
return L;
}
//获取链表元素
void GetElem_L(int i, T1 &e)
{//L带头结点的单链表指针,第i个元素存在时赋给e并返回OK,否则返回ERROR
p = L->next;//初始化,p指向第一个节点
j = 1;
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
{
cout << "error getelem!" << endl;
}
e = p->data;
}
//在链表中插入某值
Linklist ListInsert_L(int i, T1 e)
{
p = L;
j = 0;
while(p && j<i-1)
{
p = p->next;
++j;//寻找i-1节点
}
if(!p || j>i)
{
cout << "error insert!" << endl;
return L;
}
s = new LNode;
s->data = e;
s->next = p->next;//插入L
p->next = s;
return L;
}
//删除某值
Linklist ListDelete(int i, T1 &e)
{//删除第i个元素,并由e返回
p = L;
j = 0;
while(p->next && j<i-1)
{
p = p->next;
++j;
}
if(!(p->next) || j>i-1)
{
cout << "error delete!" << endl;
return L;
}
q = new LNode;
q = p->next;
p->next = q->next;
e = q->data;
return L;
}
void showdata()
{
p = new LNode;
p = L->next;//指向头结点的下一个节点
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
~linklist()
{
delete L;
delete p;
delete q;
delete s;
}
private:
int j;
LNode *p;//
LNode *s;
LNode *q;
LNode *L;
T1 data1;
T1 flag;
// Linklist L1;
};
int main()
{
// cout << "Hello World!" << endl;
//头插法
int data, data1;
linklist<int> *list = new linklist<int>;
cout << "(H)please enter numbers or chars or strings: " << endl;
list->linklistCreatH();
cout << "show linklist data:" << endl;
list->showdata();
cout << endl;
//尾插法
cout << "(H)please enter numbers or chars or strings: " << endl;
list->linklistCreatH();
cout << "show linklist data:" << endl;
list->showdata();
cout << endl;
//插入某值
cout << "after insert numbers or chars or strings " << endl;
list->ListInsert_L(3,10);
cout << "show linklist data:" << endl;
list->showdata();
cout << endl;
//查找某值
cout << "get numbers or chars or strings: " << endl;
list->GetElem_L(3,data);
cout << "input data: " << data << endl;
cout << endl;
//删除某值
cout << "delete numbers or chars or strings: " << endl;
list->ListDelete(4,data1);
cout << "delete data1: " << data1 << endl;
list->showdata();
cout << endl;
return 0;
}