这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自己的思路所编写的,有不足之处还请大牛们批评指教。

  确切的说链表属于数据结构中线性表中的内容,在链表中存储的内容是按线性排列的,就像是一条线把所要存的数据串起来,可以把链表类比成一串珠子,数据就是一个个的珠子,数据间的next指针就相当于穿珠子的线。

  链表操作的时间复杂度: 往链表中插入数据的时间复杂度为O(1)。

  想真正的理解链表及在C语言中的表示方法的前提是理解C语言中的指针和结构体,闲话少说,进代码才是关键,代码中基本上都有注释

  1.用结构体定义链表的节点

 //定义链表中的节点
 typedef struct node{
     //存储数据
     int data;
     //指向下一个节点
     struct node *next;
 }Node;

  2.定义链表的整体结构,存放链表的节点和链表中的信息

//定义链表结构
typedef struct {
    //存放头节点
    Node *head;
    //记录节点的个数
    int count;
}List;

  

  3.链表的初始化,给链表分配头结点,节点个数初始化为0

/************************************************
 *功能:初始化链表,分配头结点,结点个数为0
 *参数:链表指针
 *作者:Mr.li
 *日期:14-07-23
 ************************************************/
void initLinkList(List *list)
{
    //给头节点分配内存
    list->head = malloc(sizeof(Node));
    //头结点的下一个节点为空
    list->head->next = NULL;
    //总节点个数为0
    list->count = ;
}

  4.建立单项链表,这里为了简单起见,把要存入数据先存入到array中,下面我是用逆序的方法来创建链表的,是从head节点后插入数据,也可以用顺序建链表,从链表的后面插入数据

/************************************************
 *功能:逆序建立链表,从头结点后插入
 *参数:链表指针
 *作者:Mr.li
 *日期:14-07-23
 ************************************************/
void createLinkList(List *list)
{
    //建立链表用到的数据
    ] = {,,,,,,,,,};
    //临时节点指针用于分配节点内存
    Node *p;
    ; i < ; i++)
    {
        //给新的节点分配内存
        p = (Node *)malloc(sizeof(Node));
        //给新节点赋值
        p->data = a[i];
        //把值加入到头节点后面,逆序建立链表
        p->next = list->head->next;
        list->head->next = p;
        //链表节点个数加一
        list->count++;
    }
}

  5.为了方便查看链表中的值,需要一个打印链表中的数据的函数

/************************************************
 *功能:打印链表中的值
 *参数:链表指针
 *作者:Mr.li
 *日期:14-07-23
 ************************************************/
void printList(List *list)
{
    //临时节点指针变量
    Node *p;
    //从头开始遍历
    p = list->head->next;
    while (p != NULL)
    {
        //自定义的输出整的函数
        print(p->data);
        p = p->next;
    }
    putchar('\n');
}

  6.查询元素在链表中对于的位置

/************************************************
 *功能:查找链表中指定值的位置,有的返还其位置,无,返还-1
 *参数:链表指针,要查找的值
 *作者:Mr.li
 *日期:14-07-23
 ************************************************/
int search(List *list, int obj)
{
    //定义游标指针
    Node *p;
    //标记值的位置
    ;
    p = list->head->next;
    while (p != NULL)
    {
        local ++;
        if (p->data == obj)
        {
            //返回值的位置
            return local;
        }
        p = p->next;
    }
    //值不存在返回-1
    ;
}

  7.删除链表中的相应的数据

/************************************************
 *功能:删除链表中的值
 *参数:链表指针,要删除的值
 *作者:Mr.li
 *日期:14-07-23
 ************************************************/
void delete(List *list, int obj)
{
    //查询要删除的元素是否在链表中,有返还相应的位置,没有则返还-1
    int flag = search(list, obj);

    //判断值的合法性
    )
    {
        printf("没有要删除的值!\n");
    }
    else
    {
        //定义两个辅助游标指针
        Node *p, *q;

        //给q,p赋值
        q= list->head;
        p = list->head->next;

        //循环查找相应的值并删除
        while (p != NULL)
        {
            if (p->data == obj)
            {
                q->next = p->next;
                p->next = NULL;
                free(p);
                break;
            }
            q = p;
            p = p->next;
        }
    }
}

  8.往链表中插入数据

/************************************************
 *功能:往指定的位置后插入相应的值
 *参数:链表指针,插入的位置,插入的值
 *作者:Mr.li
 *日期:14-07-23
 ************************************************/
void insert(List *list, int local, int number)
{
    ;
    //判断值的合法性
    if(count > list->count)
    {
        printf("你输入的值不合法\n");
    }
    else
    {
        //定义游标指针,指向链表的头结点
        Node *p = list->head;
        while (count != local) {
            p++;
            count++;
        }

        //分配新的结点并给新的结点赋值
        Node *q = (Node *) malloc(sizeof(Node));
        q->data = number;
        q->next = NULL;

        //插入新的结点
        q->next = p->next;
        p->next = q;
    }

}

  以上是小菜学习链表的代码了,给大家分享一下!!

  

C语言之链表的更多相关文章

  1. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

  2. YTU 2430: C语言习题 链表建立,插入,删除,输出

    2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 576  解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...

  3. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  4. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  5. C语言:链表实现的一个实例

    问题:写一个程序输入你一年看过的所有电影以及每部电影的各种信息(简化问题:每部电影只要求输入片名和评价) 链表实现: #include<stdio.h> #include<stdli ...

  6. C语言单链表实现19个功能完全详解

    谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...

  7. (转)c语言_链表实例讲解(两个经典例子)

    建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. #include <stdio.h>#include <stdlib.h> struct grade {    ...

  8. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

    Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...

  9. c语言_链表实例讲解(两个经典例子)

    建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. demo1 // lianbiao.cpp : Defines the entry point for the console app ...

随机推荐

  1. druid sql黑名单 报异常 sql injection violation, part alway true condition not allow

    最近使用druid,发现阿里这个连接池 真的很好用,可以监控到连接池活跃连接数 开辟到多少个连接数 关闭了多少个,对于我在项目中查看错误 问题,很有帮助, 但是最近发现里面 有条sql语句 被拦截了, ...

  2. SectionIndexer示例

    This small tutorial will show you how to create a ListView, enable fast scrolling, and create a alph ...

  3. jquery 购物车飞入效果

    github https://github.com/amibug/fly demo https://github.com/amibug/fly

  4. u盘写入Ubuntu后容量变小,恢复方式

    具体请参考网址:http://jingyan.baidu.com/article/59703552e754e48fc00740ed.html 经过验证,方法是可以的

  5. CYQ.Data V5 分布式缓存MemCached应用开发介绍

    前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...

  6. 以self-contained方式在Linux上部署ASP.NET Core站点

    今天准备将一个在Windows上用VS2015开发的ASP.NET Core程序部署到阿里云Linux服务器上,部署时发现这台服务器是内网服务器,无法直接安装.NET Core SDK,于是想到尝试用 ...

  7. 安卓动态调试七种武器之离别钩 – Hooking(上)

    安卓动态调试七种武器之离别钩 – Hooking(上) 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的 ...

  8. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  9. C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword)

    C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword) +BIT祝威+悄悄在此留下版了个权的信息说: C#申请一 ...

  10. Html5绘制时钟

    最近在对Html5比较感兴趣,就用空闲时间做一些小例子进行练习,今天绘制一个走动的时钟,具体如下图所示: 具体思路在上图已有说明,代码如下: <script type="text/ja ...