专栏首页嵌入式学习链表——新建链表

链表——新建链表

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

struct node
{
    int data;
    struct node *pNext;
};

//新建node
struct node * create_node(int data)
{
    struct node *p = (struct node *) malloc (sizeof(struct node));
	
    if(NULL == p)
    {
        printf("malloc error!.\n");
        return NULL;
    }
    memset(p, 0, sizeof(struct node));
    p->data = data;
    p->pNext = NULL;

    return p;
}

void insert_tail(struct node *pH, struct node *newp)
{
    struct node * p = pH;
    while(NULL != p->pNext)
    {
        p = p->pNext;
    }
    p->pNext = newp;
}

void insert_head(struct node * pH, struct node *newp)
{
    newp->pNext = pH->pNext;
    pH->pNext = newp;
}

//excluding header data
void list_for_each_1(struct node *pH)
{
    struct node *p = pH->pNext;
    printf("------------begin------------\n");
    while(NULL != p->pNext)
    {
        printf("node data : %d.\n", p->data);
        p = p->pNext;
    }
    printf("node data : %d.\n", p->data);
    printf("------------end------------\n");
}

//excluding header data version 2 simplify
void list_for_each_3(struct node *pH)
{
    struct node *p = pH;
    printf("------------begin------------\n");
    while(NULL != p->pNext)
    {
        p = p->pNext;
        printf("node data : %d.\n", p->data);
    }
    printf("------------end------------\n");
}

//including header data
int list_for_each_2(struct node *pH)
{
    struct node *p = pH;
    printf("------------begin------------\n");
    if(NULL == p)
    {
    	printf("nothing.\n");
    	return -1;
	}
    while(NULL != p->pNext)
    {
        printf("node data : %d.\n", p->data);
        p = p->pNext;
    }
    printf("node data : %d.\n", p->data);
    printf("------------end------------\n");
    return 0;
}

//can not delete header node data
int delete_node(struct node * pH, int data)
{
    struct node *p = pH;
    struct node *pPrev = NULL;
    while(NULL != p->pNext)
    {
        pPrev = p;
        p = p->pNext;
        if(p->data == data)
        {
            if(NULL == p->pNext)
            {
                pPrev->pNext = NULL;
                free(p);
            }
            else
            {
                pPrev->pNext = p->pNext;
                free(p);
            }
			return 0;
        }
    }
    printf("no node deleted.\n");
    return -1;
}

//can delete all node including the tail node and header node
struct node * delete_node_2(struct node * pH, int data)
{
    struct node *p = pH;
    struct node *pPrev = NULL;
	pPrev = p;
    while(NULL != p) //traserval to tail
    {
		if(p->data == data)
		{
			//delete header node
			if(p->data == pH->data)
			{
				pH = p->pNext;
				free(p);
				printf("node %d deleted ok.\n",data);
				return pH; //delete ok!
			}
			else
			{
				//delete tail node
				if(NULL == p->pNext)
				{
					pPrev->pNext = NULL;
					free(p);
				}
				else
				{
					pPrev->pNext = p->pNext;
					free(p);
				}
				printf("node %d deleted ok.\n",data);
				return pH;
			}
			printf("node %d deleted ok.\n",data);
		}
		pPrev = p;
		p = p->pNext;
    }
    return pH;
}


int main()
{
    struct node * pHeader = create_node(1);
	printf("Hello world!\n");

    insert_tail(pHeader, create_node(2));
    insert_tail(pHeader, create_node(3));
    insert_head(pHeader, create_node(4));
    insert_head(pHeader, create_node(5));
    list_for_each_2(pHeader);
	pHeader = delete_node_2(pHeader, 3);
	pHeader = delete_node_2(pHeader, 2);
	pHeader = delete_node_2(pHeader, 5);
	pHeader = delete_node_2(pHeader, 4);
	pHeader = delete_node_2(pHeader, 1);
	list_for_each_2(pHeader);
//    printf("1 = %d\n",pHeader->data);
//    printf("2 = %d\n",pHeader->pNext->data);
//    printf("3 = %d\n",pHeader->pNext->pNext->data);
//    printf("4 = %d\n",pHeader->pNext->pNext->pNext->data);
//    printf("5 = %d\n",pHeader->pNext->pNext->pNext->pNext->data);

    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言面试之——地址的强制转换

    这里(int)i_a是把数组i_a的值转换为int类型的数值,而不是地址,然后再加1,如上图所示,ptr1_pi[-1]的值大家应该知道,就是数组i_a的下一个...

    用户4645519
  • C语言定义数组时使用枚举作为数组的下标

    昨天写代码被人告知还有这种写法,很神奇。通常情况下定义数组都是顶一个什么类型的数组然后下标或者脚标就是从0开始++++

    用户4645519
  • C语言calloc()函数:分配内存空间并初始化——stm32中的应用

    经常在代码中看到使用malloc来分配,然后memset清零,其实calloc更加方便,一句顶两句~

    用户4645519
  • 使用 nvm 管理不同版本的 node 与 npm

    使用 nvm 管理不同版本的 node 与 npm 补充说明:Mac 下通过 brew install nvm 所安装的 nvm ,由于安装路径不同,无法正确启...

    庞小明
  • SAP CRM WebClient UI的on_new_focus应该怎么理解

    Double click on method CONNECT_NODES.Make Value node ‘Competitors’

    Jerry Wang
  • 二叉树的遍历以及遇到的一些问题

    这里以二叉树的前序遍历为例。输入前序遍历的数据元素(以空格作为空元素),构造二叉树,然后遍历二叉树输出每个数据元素所在的层。

    卡尔曼和玻尔兹曼谁曼
  • 干货 | Active Learning: 一个降低深度学习时间,空间,经济成本的解决方案

    大数据文摘
  • Golang之实现(链表)

    超蛋lhy
  • 表的应用——排序与描述多项式排序多项式ADTGO语言笔记

    排序 朴素排序 在链表建立的过程中可以直接完成排序功能,即建立一个新链表并将源数据一个一个存进新链表中,每个元素存储的位置在小于这个元素的节点和大于这个元素的节...

    月见樽
  • 力扣LeetCode,前 K 个高频元素

    1、优先队列的经典问题,在1000000个元素中选出前100名元素,题型模式如在N个元素中选出前M个元素。

    别先生

扫码关注云+社区

领取腾讯云代金券