单向循环链表基本操作

C和其他语言都一样,只是关键字更少,更接近硬件,底层操作大都需要用C中的头文件和库函数来实现。学习的过程也不乏乐趣,在入门阶段,不建议大家去磨练算法,非常枯燥。建议学习一些系统编程和网络编程,趣味性更强,也能做一些有用的东西,不会乏味到失去兴趣。等过了这个阶段,对C的认识已经比较全面和具有一定深度了,再去看一些算法相关的,也不会觉得很复杂了。后期,不管用什么语言都完全是个人思维的表达,不影响表达思想和实现的工具都是好工具。不要陷入编程语言的纠缠和纷争。临渊羡鱼,不如退而结网。

下面根据自己的理解,实现一个单向循环链表和一个向链表中插入新元素的操作。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// 定义数据类型
typedef struct _stack{
        int a;
        int b;
        struct _stack *c;
}stack;

// 主函数
int main(int argc, char const *argv[])
{
        stack s, *real_stack_head, *real_stack_tail;
        real_stack_head = (stack*)malloc(10*sizeof(stack));  // 申请内存

        if (real_stack_head == NULL)
        {
                _exit(127);
        }  // 判断是否成功

        for (int i = 0; i < 10; ++i)
        {
                (real_stack_head+i)->a=i;
                (real_stack_head+i)->b=i+1;
                (real_stack_head+i)->c=real_stack_head+i+1;
                if (i==9)
                {
                        (real_stack_head+i)->c=real_stack_head;
                        real_stack_tail=real_stack_head+i;
                }
        }  // 给元素赋初值

        // for (int i = 0; i < 10; ++i)
        // {
        //         printf("a=%2d, b=%2d, c=%p\n", (real_stack_head+i)->a,(real_stack_head+i)->b,(real_stack_head+i)->c);
        // }

// 给循环链表增加新的元素,参考操作系统的实现,建议这时候多申请一些内存,如果还有新的元素加入,就不需要频繁的申请内存了,能够提高程序的运行性能。
        stack *new_one=(stack*)malloc(1*sizeof(stack));
        new_one->a=10;
        new_one->b=11;
        new_one->c=real_stack_head;

        real_stack_tail->c=new_one;
        real_stack_tail=new_one;

// 单向循环链表遍历:
        s=*real_stack_head;
        while(s.c != real_stack_head ){
                printf("a=%2d, b=%2d, c=%p\n", s.a, s.b, s.c);
                s=*s.c;
        }
        printf("a=%2d, b=%2d, c=%p\n", s.a, s.b, s.c);

        free(real_stack_head);
        free(new_one);

        return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值