找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4556|回复: 0
收起左侧

解析uc/os-ii操作系统--之创建一个单向链表

[复制链接]
ID:91442 发表于 2015-10-29 15:31 | 显示全部楼层 |阅读模式
文章目录:
解析uc/os-ii操作系统之-写在前面:http://www.51hei.com/bbs/dpj-39350-1.html
解析uc/os-ii操作系统--之创建一个单向链表:http://www.51hei.com/bbs/dpj-39833-1.html
单向链表之--添加结点的程序详解:http://www.51hei.com/bbs/dpj-39834-1.html
什么是“堆”和“栈”? 动态内存分配? :http://www.51hei.com/bbs/dpj-39835-1.html
C语言函数指针,函数动态回调:http://www.51hei.com/bbs/dpj-39836-1.html

       操作系统最核心的部分就是任务或曰线程(个人认为叫线程Thread更好),当用户创建好了各个线程并启动系统之后就交给操作系统内核去调度了。uc/os-ii操作系统的每个线程都对应一个任务控制块TCB,实际上TCB就是链表的一个结点node;将每个结点链接成双向链表,再对结点进行插入,删除,遍历等操作是uc/os-ii操作系统源码中最常见的部分。为此,本人非常愿意学习一下如何创建一个链表,并表示要真正的理解和学会创建一个简单的单向链表的方法和技巧。链表应该是c语言的较为复杂的部分了;没有较好的c语言功底,感觉真的很难去理解uc/os-ii操作系统原理。

  创建一个单向链表的思想:
通过3个指向结点的指针变量head,p1,p2,可以创建一个任意长的单向链表(理论上如果内存足够大的话),链表的优点就是插入,删除,生成,遍历操作很方便。本例程中:通过PC键盘给每个结点数据域变量赋值,当键盘输入“0”则退出链表创建程序。也就是说当键盘每输入一个值本例就可以生成一个结点并链接成一个单向链表,然后是遍历每个结点。具体在源码中有详细注释。

  本例程以徐彤老师C语言链表例程为蓝本编写,本人敲了3遍。下面的程序可以在VS2013和VC++6.0编译平台运行:直接复制即可。

#include "stdafx.h"
#include"stdio.h"
//#include"malloc.h"
//#define _CRT_SECURE_NO_WARNINGS
struct node
{
        int num;
        node *next;

};  //声明一个结点
/*通过3个指针变量*head,*p1,*p2,创建一个若干长的单向链表*/
node * creat(void)
{
        node *head, *p1, *p2;//声明3个指向结点的指针变量,注意,这里指针没有初始化,指针指向的可能是乱码  
        p1 = new node; //给p1赋值,p1先行开辟空间

        scanf_s("%d", &p1->num);//通过PC键盘给结点数据域变量赋值,因为只有p1已经有明确的指向
        head = p2 = p1;//3个指针指向相同的node空间,能不能写成head=p1=p2?不符合语法
  while (p1->num != 0)  //只要键盘输入的不是0,就循环生成结点并链接成单向链表
  {
        p1 = new node;//通过循环不断开辟新的结点p1,
        scanf_s("%d", &p1->num);//给新的结点p1数据域变量赋值,该句决定while循环何时结束
        p2->next = p1;//让p2成为链表连接的桥梁,循环刚开始时“ head=p2=p1”所以p2指向第一个结点,有所指向!
        p2 = p1;//这两句是本程序的核心所在,让p2也指向新开辟出来的结点空间,此时p2和p1指向了相同的新结点!

}

        p2->next = NULL;//当程序跳出while循环后,说明创建链表已经结束;此时就将最后一个结点指针域指向NULL!
        return head;//返回链表头指针,为什么返回头指针?有了这个链表的头指针,就可以遍历任意一个结点

}
void display(node* head)//链表头指针作为传递参数
{
        node *p = head;
        while (p->next != NULL)  //从链表头指针开始遍历
        {

                printf("%d\n", p->num);
                p = p->next;//这一步很关键!要理解!将下一个结点的指针传递给p,此时p就指向了下一个结点。
     //不断的指向后续结点,此时p就指向了下一个结点
        }

}
void main()
{
        node *head = creat();//创建链表头指针
        display(head);//打印结果

}

鉴于本文公开,可能路遇强人。特声明:本人只是学习者和爱好者,错误之处有时难免欢迎指正。谢谢。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表