C语言双链表框架搭建练习(一)

在数据结构中,链表是不可或缺的存在,其在功能特点上与数组的对立也是它具有在增删上的独特优势;而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;
}

下一部分我们会介绍双链表以及后面的环状链表。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值