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;
}