zoukankan      html  css  js  c++  java
  • C/C++单向链表

    由于时间仓促,作者并没有进行任何的检查,总之徒手165行,调试无BUG,基本功能的实现并无大问题,可能有些细节考虑不周(这也是C/C++的诟病,小车不倒只管前推),还忘见谅。

    代码是在C++环境编写,可以在C编译平台运行,但要进行修改(把声明变量语句,写在执行语句之前)。

    #include <stdio.h>
    #include <stdlib.h>
    //定义节点,所有节点必须用malloc()申请在堆中,在程序执行阶段保证空间的存在;
    //-1表示非正常退出
    typedef struct node
    {
        int data;
        node *next;
    } Node;
    //用来表示链表的长度,-1表示无头节点的空表
    int len = -1;
    //定义一个全局头结点
    Node *head = NULL;
    
    //创建一个带有头节点的空链表
    void createNodeList()
    {
        if (head != NULL)//表示为非空表
            exit(-1);//非正常退出
        head = (Node *)malloc(sizeof(Node));//申请堆空间
        if (head == NULL) //如果head==NULL则申请失败
            exit(-1);
        //头结点的数据域为0,指针域为NULL
        head->data = 0;
        head->next = NULL;
        len = 0;//0表示有头节点的空表
    
    }
    
    //添加一个节点(向当前节点的指针域为NULL的节点后面添加)
    void addNode(int data)
    {
        if (head == NULL)//表示为空表
            exit(-1);
        Node *newNode = (Node *)malloc((sizeof(Node)));//创建一个新节点
        if (newNode == NULL)//申请失败
            exit(-1);
        //初始化新结点的数据域和指针域
        newNode->data = data;
        newNode->next = NULL;
        //连接工作
        Node *p = head;//当前节点
        Node *q = head->next;//下一个节点
        while (q != NULL)
        {
            //循环成立表示当前结点的指针域不为NULL
            p = q;//更新当前结点
            q = p->next;//更新当前结点的
        }
        //循环结束表示当前节点的指针域为NULL
        //更新当前节点指针域为新结点
        p->next = newNode;
        len++;//表长加一
    }
    //获取节点数据(0<index<len)
    int getNode(int index)
    {
        int data = -1;
        if (head == NULL)//表示为空表
            exit(-1);
        if (index < 0)//下标要从0开始
            exit(-1);
        if (index >= len)//下标越界
            exit(-1);
        Node *p = head->next;
        data = p->data;
        for (int i = 0; i < index;i++)
        {
            p=p->next;
        }
        data = p->data;
        return data;
    }
    //元素查找
    int getData(int data)
    {
        if (head == NULL)//表示为空表
            exit(-1);
        Node *p = head->next;//表示第一个节点
        for (int i = 0;p!=NULL;i++)
        {
            if (p->data==data)
                return i;//返回下标
            p = p->next;
        }
    }
    //向屏幕打印链表
    void getLinks()
    {
        if (head == NULL)//表示为空表
            exit(-1);
        //指向第一个节点
        Node *p = head->next;
        //如果该结节不为NULL则表示存在该节点
        while (p != NULL)
        {
            printf("%d
    ", p->data);
            p = p->next;
        }
    }
    //删除节点
    void removeNode(int index)
    {
        if (head == NULL)//表示为空表
            exit(-1);
        if (index < 0)//下标要从0开始
            exit(-1);
        if (index >= len)//下标越界
            exit(-1);
        //p表示当前节点,q表示当前节点的指针域
        Node *p = head;//要被删除的前一个节点
        Node *q = head->next;//要被删除的节点
        for (int i = 0; i < index;i++)
        {
            p = q;
            q = p->next;
        }
        //重新连接
        p->next = q->next;
        free(q);//删除q节点
        len--;//表长减一
    }
    //清空链表
    void cleanLinks()//表示为空表
    {
        if (head == NULL)
            exit(-1);
    
        Node *p = head;//当前节点
        Node *q=head->next;//下一个节点
        free(p);//删除当前节点
        while (q!=NULL)
        {
            p = q;
            q = p->next;
            free(p);//删除当前节点
        }
        len = -1;//表示该表为空
    }
    void main()
    {
        //创建表
        createNodeList();
        //添加元素
        addNode(1);
        addNode(2);
        addNode(3);
        addNode(4);
        //打印表,和表长
        getLinks();
        printf("len:%d
    ", len);
        //查看第三个节点"4"
        printf("index 3:%d
    ",getNode(3));
        //数据4所在节点下标
        printf("data 4:%d
    ",getData(4));
        //删除第三个元素”3“
        removeNode(2);
        //分隔符
        printf("=============
    ");
        //再次打印表和表长
        getLinks();
        printf("len:%d
    ", len);
        cleanLinks();
        system("pause");
    }
  • 相关阅读:
    python模块安装路径
    yum软件搜索
    项目里用到的python知识点
    python调用C函数
    opencv VideoCapture使用示例
    Django模型层之多表操作
    博客园 装饰
    mysql条件查询-排除null ---oracle、mysql 区分总结
    Android——Fragment详解
    Android——监听事件总结
  • 原文地址:https://www.cnblogs.com/chaeyeon/p/5935129.html
Copyright © 2011-2022 走看看