链表(Linked table)是数据结构中最基础的概念,它是一种抽象的数据结构,由若干个节点(Node)组成,每个节点有两个部分,数据域和指针域,数据域用来存放相应的数据,指针域存放下一个节点的地址,用于之后的增删查改,最后一个节点的指针域指向NULL。在C/C++语言中,链表一般是由结构体来进行定义 ,那么就让我们先来简单的定义一个链表的节点吧。(数据域暂且定义成一个整型的变量)
#include<iostream>
#include<cstdlib>
using namespace std;
typedef int Elemtype;
typedef struct Node {
Elemtype data;
struct node* next;
}Node;
typedef Node* Link;
这样一个链表的节点就定义好了,接下来就是需要对链表进行的各种操作。创建链表,访问链表,找到第k位元素的位置,增加节点,删除节点,计算链表长度。接下来就让我们对每个操作进行代码的实现。
Link init(int); //创建链表
void visit(Link); //访问链表的元素
Link Insert(Elemtype, int, Link); //添加新的节点
Link Delete(int, Link); //删除节点
int Length(Link); //求链表的长度
Link FindKth(int, Link); //找到第k个节点的位置
动态创建链表
在动态创建链表的时候,需要有两个指针来指向链表,来便于我们的创建操作。一个是头指针h,用来指向链表的第一个节点,一个是尾指针tail,用来指向链表的表尾。
Link init(int n)
{
Link h = NULL, tail = h, p;
int i;
for(i = 1; i <= n; i++)
{
p = new LNode; //为节点分配空间
cout << "please input the data:";
cin >> p->data;
p->next = NULL;
if (h == NULL) //判断头指针是否指向了头节点
h = p;
else
tail->next = p; //若头指针已经指向了头节点,则让尾指针所指向的节点的指针域指向新创建的节点
tail = p; //让尾指针指向新创建的节点
}
return h; //最后返回头指针
}
访问链表
链表创建完了后,就可以对它进行访问,对整个链表进行遍历,读取它的数据。
void visit(Link h)
{
Link p = h;
while (p) //当p所指向的节点指针域不为NULL,则一直循环,遍历整个链表
{
cout << p->data << " ";
p = p->next;
}
}
找到第k位元素的位置
Link FindKth(int k, Link h)
{
Link p = h;
int count = 1;
while (p != NULL && count < k)
{
p = p->next;
count++;
}
if (count == k) return p;
else return NULL;
}
增加节点
Link Insert(Elemtype X, int i, Link h)
{
Link p, s;
if (i == 1) //当插入的位序为1时,及在表头插入
{
s = new LNode;
s->data = X;
s->next = h;
return s;
}
p = FindKth(i - 1, h);
if (p == NULL) //当所插入的位序小于0或者超出链表的范围
{
cout << "error!";
return NULL;
}
else
{
s = new LNode;
s->data = X;
s->next = p->next;
p->next = s;
return h;
}
}
删除节点
Link Delete(int i , Link h)
{
Link t;
if (i == 1) //当删除的节点为头节点时
{
t = h;
h = t->next;
delete t;
return h;
}
Link p;
p = FindKth(i - 1, h); //找到要删除的节点的前一个节点
t = p->next;
p->next = t->next;
delete t;
return h;
}
计算链表长度
int Length(Link h)
{
Link p = h;
int count = 0;
while (p)
{
count++;
p = p->next;
}
return count;
}
以上便是对链表的创建以及对它基本操作代码的实现