• C 单向链表的创建、插入及删除


    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

    #include <stdio.h>//printf()
    #include <stdlib.h>//malloc(), free(), system()
    #include <string.h>//memset()内存初始化
    
    typedef struct  Node *PtrToNode;
    struct Node
    {
    	int myData;
    	PtrToNode nextPtr;
    };

    注意相应头文件的包含!!!

    1、单节点链表的创建

    PtrToNode phead = (PtrToNode)malloc(sizeof(struct Node));//申请第一个节点内存空间,phead指向该内存空间
    if (phead == NULL)
    {
    	printf("malloc fair
    ");
    	system("pause");
    }
    memset(phead, 0, sizeof(struct Node));//内存空间清零
    phead->myData = 100;
    phead->nextPtr = NULL;

    2、连续链表的创建

    创建连续链表时,主要思想是:每创建一个新节点,就可以为其内部除指针外的其他数据赋值,指针数据暂时不管。当下一个结点创建完毕后,再将之前未赋值的指针指向该结点。

    连续列表的创建过程中,需要用到三个指针,分别指向:头节点地址、中间结点地址和尾节点地址,并注意及时更新。

    PtrToNode Creat(int num)
    {
    	PtrToNode phead = (PtrToNode)malloc(sizeof(struct Node));//头结点地址
    	if (phead == NULL)
    	{
    		printf("malloc fair
    ");
    		system("pause");
    	}
    	PtrToNode p0 = phead;//中间结点地址
    	PtrToNode p1 = phead;//尾结点地址
    	memset(phead, 0, sizeof(struct Node));//内存空间清零
    	phead->myData = 0;
    	int i = 0;
    	for (i = 1; i < num; i++)
    	{
    		p0 = (PtrToNode)malloc(sizeof(struct Node));
    		if (p0 == NULL)
    		{
    			printf("malloc fair
    ");
    			system("pause");
    		}
    		memset(p0, 0, sizeof(struct Node));//内存空间清零
    		p0->myData = i;//中间结点创建完毕
    		p1->nextPtr = p0;//将之前尾结点的nextPtr指向新创建的结点地址
    		p1= p0;//更新尾节点
    	}
    	p1->nextPtr = NULL;//将链表尾结点的nextPtr赋值为NULL
    	return phead;
    }

    3、指定位置节点的插入

    phead为链表首结点地址,num指定插入的位置(本程序链表结点序号从0开始),data是插入节点的数据信息。

    PtrToNode Insert(PtrToNode phead, int num, int data)
    {
    	PtrToNode p = phead;
    	int i = 0;
    	for(i = 0; i < num - 1; i++)//p指向第num -1个结点的首地址(首结点为第0个结点)
    		p = p->nextPtr;
    	PtrToNode pnew = (PtrToNode)malloc(sizeof(struct Node));
    	PtrToNode pmid = p->nextPtr;//暂时存放p->nextPtr
    	p->nextPtr = pnew;
    	pnew->myData = data;
    	pnew->nextPtr = pmid;
    	return phead;
    }

    4、指定位置结点的删除

    phead为链表首结点地址,num指定删除的位置(本程序链表结点序号从0开始)。

    PtrToNode Delete(PtrToNode phead, int num)
    {
    	PtrToNode p = phead;
    	int i = 0;
    	for (i = 0; i < num-1 ; i++)//p指向第num-1个结点的首地址(首结点为第0个结点)
    		p = p->nextPtr;
    	PtrToNode pnum = p->nextPtr;
    	p->nextPtr = pnum->nextPtr;
    	free(pnum);//注意将删除的结点内存空间释放
    	return phead;
    }
  • 相关阅读:
    BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
    Luogu 3690 Link Cut Tree
    CF1009F Dominant Indices
    CF600E Lomsat gelral
    bzoj 4303 数列
    CF1114F Please, another Queries on Array?
    CF1114B Yet Another Array Partitioning Task
    bzoj 1858 序列操作
    bzoj 4852 炸弹攻击
    bzoj 3564 信号增幅仪
  • 原文地址:https://www.cnblogs.com/HL-space/p/10546599.html
Copyright © 2020-2023  润新知