单向非循环链表:链表创建、节点插入、链表打印、节点长度计算、链表清空、链表销毁

/* 单向非循环链表:
    初始化
    前插入

后插入
    打印
    链表长度
    清空
    销毁
*/
#include <stdio.h>
#include <stdlib.h>

#define itemType int

typedef struct node
{
    itemType data;
    struct node *pNext;
}Node;

/* 创建Head节点: 节点的pNext为NULL */
int initList(Node **ppN)
{
    Node *pNewNode = (Node *)malloc(sizeof(Node));
    if (NULL == pNewNode)
    {
        printf("initList fail\n");
        return -1;
    }

printf("pNewNode address: %p\n", pNewNode);
    pNewNode->pNext = NULL;
    pNewNode->data = 0;

*ppN = pNewNode;
    
    return 0;
}

/* 前向插入一个节点 */
int insertListHead(Node *pN, itemType data)
{
    Node *pNewNode = (Node *)malloc(sizeof(Node));
    if (NULL == pNewNode)
    {
        printf("insertListHead fail\n");
        return -1;
    }
    
    printf("pNewNode address: %p\n", pNewNode);
    pNewNode->pNext = NULL;
    pNewNode->data = data;
    
    pNewNode->pNext = pN->pNext;
    pN->pNext = pNewNode;

return 0;
}

/* 后向插入一个节点 */
int insertListTail(Node *pN, itemType data)
{
    Node *pNewNode = (Node *)malloc(sizeof(Node));
    if (NULL == pNewNode)
    {
        printf("insertListTail fail\n");
        return -1;
    }
    
    printf("pNewNode address: %p\n", pNewNode);
    pNewNode->pNext = NULL;
    pNewNode->data = data;
    
    /* 查找最后一个节点 */
    while(NULL != pN->pNext)
    {
        pN = pN->pNext;
    }
    pN->pNext = pNewNode;

return 0;
}

/* 链表打印 */
int printList(Node *pN)
{
    if (NULL == pN)
    {
        printf("printList is not exist\n");
        return -1;
    }
    
    if (NULL == pN->pNext)
    {
        printf("printList is NULL\n");
        return -1;
    }
    
    while(NULL != pN)
    {
        printf("Node address: %p, Node value: %3d, Node Next: %p\n", pN, pN->data, pN->pNext);
        pN = pN->pNext;
    }
    
    return 0;
}

/* 链表长度 */
int listLength(Node *pN)
{
    int len = 0;

if (NULL == pN)
    {
        printf("listLength NULL\n");
        return 0;
    }
    
    while(NULL != pN->pNext)
    {
        len++;
        pN = pN->pNext;
    }
    
    return len;
}

/* 清空链表:保留Head节点,其它全部资源 释放 */
int emptyList(Node *pN)
{
    Node *pTempNode = NULL;

if (NULL == pN)
    {
        printf("emptyList is NULL\n");
        return -1;
    }
    
    while (NULL != pN->pNext)
    {
        pTempNode = pN->pNext;
        pN->pNext = pTempNode->pNext;
        
        free(pTempNode);
    }
    pTempNode = NULL;

return 0;
}

/* 销毁链表:释放所有节点,包括Head节点 */
int destoryList(Node **pN)
{
    emptyList(*pN);
    free(*pN);
    *pN = NULL;

return 0;    
}

/* 测试入口 */
int main(void)
{
    Node *pHeadNode = NULL;
    initList(&pHeadNode);

for (int i=0; i<20; i++)
    {
        insertListHead(pHeadNode, i+1);
        insertListTail(pHeadNode, i+101);
    }

printf("listLength: %d\n", listLength(pHeadNode));
    printList(pHeadNode);

emptyList(pHeadNode);
    destoryList(&pHeadNode);

printList(pHeadNode);

return 0;
}

原文地址:https://www.cnblogs.com/tedani/p/9984427.html

时间: 2024-07-30 17:49:04

单向非循环链表:链表创建、节点插入、链表打印、节点长度计算、链表清空、链表销毁的相关文章

链表(创建,插入,删除和打印输出(转载)

链表(创建,插入,删除和打印输出 /*----------------------------------------------------------------------------- 文件功能:实现了动态建立一个学生信息的链表包括链表的创建.插入.删除.和打印输出学生信息包括姓名和分数本链表是带有头结点的,头结点的内容为空内容-----------------------------------------------------------------------------*//*

循环链表的创建、插入、删除、逆序、显示(C++实现)

对于单链表,因为每一个结点仅仅存储了向后的指针.到了尾标志就停止了向后链的操作,这样,其中某一结点就无法找到它的前驱结点了. 对于单链表的操作大家能够看我的这篇博客http://blog.csdn.net/zxnsirius/article/details/51183055 我们将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成了一个环.这样的头尾相接的单链表称为单循环链表,简称循环链表. 以下是循环链表的综合操作的样例 程序执行结果

链表学习一:单链表创建-头插入与尾插入

链表的创建过程是一个动态的生成过程,创建链表有两种思路,一种是从表头插入,另一种是从表尾插入. 表头插入思路:从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止. 表尾插入思路:从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表尾上,直到读入结束标志为止. 两种方法C++实现如下: 1 #include<iostream> 2 using namespace

怎样创建并插入一个属性节点

可以使用下面的两种方法将一个新创建的属性节点设置到特定元素节点上. var node = document.getElementById('div1'); var a = document.createAttribute('my_attrib'); a.value = 'newVal'; node.setAttributeNode(a); // 或者 node.setAttribute('my_attrib', 'newVal'); 注意: 这里的属性名和属性值可以自定义. 原文地址:https

怎样创建并插入一个注释节点

使用document.createComment(). document.body.prepend(document.createComment('helloworld')); 如上所示, 我们在body子元素顶部增加了一个注释节点: <!--helloworld--> 原文地址:https://www.cnblogs.com/aisowe/p/11546417.html

C语言实现双向非循环链表(带头结点尾结点)的节点插入

对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾结点的情况下在任意的位置插入元素.代码上传至 https://github.com/chenyufeng1991/InsertNodeDoubleLinkedList_HeadNode . 核心代码如下: //插入一个节点 //插入位置分别为0,1,2,..... int InsertNodeList(Nod

DOM节点对象之创建和插入节点示例

示例:创建和插入节点. 1.新建节点:createElement("节点名") 2.新建文本节点:createTextNode("文本内容") 3.将文本节点添加到新建节点中:appendChild(文本节点名) 4.获取要插入节点的对象:getElementById("id名") 5.将新建节点插入到目标节点对象中:insertChild(要插入节点名,目标节点位置) <!doctype html><html><h

C语言实现双向非循环链表的逆序打印

我在上一篇博客中<C语言实现双向非循环链表>实现了如何构造一个双向非循环链表,并实现了正向打印.我还在之前一篇博客<C语言实现单链表的逆序打印>中实现了单链表的逆序打印.这篇博客我们来实现对双向非循环链表进行逆序打印,实现起来非常的简单.代码已经上传至 https://github.com/chenyufeng1991/ReverseDoubleLinkedList . 核心代码如下: //打印非循环双向链表,这个其实是正向打印 void printList(Node *pNode

用c语言完成一个双向链表的创建,插入,删除

/*dlist.h*/ #ifndef DList_H #define DList_H typedef  int Item; typedef struct Node * PNode;  //节点指针 typedef PNode Position;  //节点位置 /*定义节点类型*/ typedef struct Node { Item data;      /*数据域*/ PNode previous; /*指向前驱*/ PNode next;     /*指向后继*/ }Node; /*定义