在数据结构中,链表是不可或缺的存在,其在功能特点上与数组的对立也是它具有在增删上的独特优势;而C语言虽然在链表处理上的方便程度不如C++,但是更基层代表着更灵活。将二者结合,我们就可以根据需求做出不同的链表结构,在完成基础的搭建之后,看上去代码量很大的C语言也可以很方便的操作,而且在运行速度和灵活性上完胜C++。
下面将搭建链表的结构框架:
首先是链表结构体定义
struct linklist
{
datatype data;
struct linklist *pnext;
};
typedef struct linklist node;
为链表添加数据
node* adddata(node* phead, datatype data)
{
node*pnew = (node *)malloc(sizeof(node));
pnew->data = data;
pnew->pnext = NULL;
if (phead == NULL)
{
phead = pnew;
}
else
{
node *p;
for (p = phead; p->pnext != NULL; p = p->pnext)
{
//找到下一个节点地址pnext为空的节点
}
p->pnext = pnew;
}
return phead;
}
创建链表
node* link = NULL;
//init(link, 0); 头节点不分配内存
link = adddata(link, 20);
link = adddata(link, 0);
link = adddata(link, 21);
link = adddata(link, 3);
link = adddata(link, 56);
link = adddata(link, 7);
link = adddata(link, 1);
link = adddata(link, 32);
link = adddata(link, 5);
link = adddata(link, 6);
获取链表节点个数
int getnum(node *phead)
{
int num = 0;
for (node*p = phead; p != NULL; p = p->pnext)
{
num++;
}
return num;
}
元素交换
void swap(node*p1, node*p2)
{
datatype temp = p1->data;
p1->data = p2->data;
p2->data = temp;
}
链表显示
void showdata(node* phead)
{
for (node *p = phead; p != NULL; p = p->pnext)
{
printf("%d ", p->data);
}
printf("\n");
}
递归排序
void sortdata(node* phead, node* pback) //用到phead的有:指针遍历的初始化;遍历的判断标准;遍历完成之后的位置交换
{ //用到pback的有:递归的结束条件;遍历循环的结束条件
if (phead == pback)
{
return;
}
node *p1 = phead, *p2 = phead->pnext;
// p1->data p2->data
while (p2 != pback) //这里的变量最后元素在变化,无论是数组还是链表,都要加入结尾变量作为循环结束条件
{
if (p2->data < phead->data) //这里注意是与前面的变量想比较,决定是否往前移动,若小于,则不移动
{
p1 = p1->pnext;
swap(p1, p2);
}
p2 = p2->pnext;
}
swap(phead, p1);
sortdata(phead, p1);
sortdata(p1->pnext, pback);
}
链表反转
node* rev(node*phead)
{
if (phead == NULL || phead->pnext == NULL)
{
return phead;
}
node *p1 = phead, *p2 = phead->pnext, *p3 = NULL; //进行差别有三个位置的拷贝,就要创立三个指针,进行轮替
while (p2 != NULL)
{
//赋值
p3 = p2->pnext; //在指针前进之前要进行指针的赋值,赋值的方向是将前方的地址写入后方的变量
p2->pnext = p1;
p1 = p2; //赋值结束之后就要将三个指针向后移动,将后方的指针赋值给前方的指针就是相当于把指针向后移动
p2 = p3;
}
phead->pnext = NULL;
return p1;
}
下一部分我们会介绍双链表以及后面的环状链表。