链表是基础的数据结构,是一种线性表,它能够用通过顺序存储和链式存储两种方式。
采用顺序存储的可以建立如下结构体。
将所有的元素存储在数组中,这样建立的链表,链表的存储也比较方便,但是这样的链表缺少灵活性,而且是静态的,不能够任意增大链表的长度,操作起来不方便。
下面介绍链式存储的链表,也是常用的存储方式
建立结构体,结构体中含有指向下一个节点的指针和元素的类型。
下面介绍链表的一些基本操作
首先是建立一个空的链表,链表中有一个空节点,并指向NULL
该函数的功能是计算该链表的总长度
根据上面函数我们可以找到第k个节点所在的位置
该函数可以找到第一个元素为x所在的节点
List insert(elementtype x, int i, List plist) //插入一个新节点,插入在位置为在第i-1的后面,是第i个节点
{
List p ;
List s;
if (i == 1) //表示插入的节点在表头
{
s= new node[sizeof(struct node)];
s->data = x;
s->next = plist;
return s;
}
else
{
p = findKth(i - 1, plist);
if (p)
{
cout<< "插入位置错误,另选择位置插入";
return NULL;
}
else
{
s = new node[sizeof(struct node)];
s->data = x;
s->next= p->next;
p->next = s;
return plist;
}
}
}
该函数可以在任意位置插入一个新节点
List delete_list(int i, List plist)//删除第i个节点
{
List p, s;
if (plist == NULL)
{
return NULL;
}
else
{
if (i == 1)
{
s = plist;
plist = s->next;
delete s;
return plist;
}
else
{
p = findKth(i - 1, plist);
if (p == NULL || p->next == NULL)
{
cout << "该位置不存在";
return NULL;
}
else
{
s = p->next;
p->next = s->next;
delete s;
return plist;
}
}
}
}
该函数删除任意节点
List reverse_list(int K,List plist )//逆转链表,k表示将前面k个节点进行逆转
{
List head; //头结点
List tmp; //下一个节点的位置
List New;//已经完成逆转的链表
List old; //当前需要逆转的节点
int cnt = 0;//计数器
int length;
length = list_length(plist);
if (length < K)
{
cout << "链表长度小于所要逆转的节点个数";
return NULL;
}
else
{
head = new node[sizeof(struct node)];
head->next = plist;
New = head->next;
old = New->next;
while (cnt < K-1)
{
tmp = old->next;
old->next = New;
New = old;
old = tmp;
cnt++;
}
head->next = New; New->next = old; //处理逆转完之后的头和尾部
return New;
}
}
该函数可以实现前K个元素的单链表逆转