zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    python验证卡普耶卡(D.R.Kaprekar)6174猜想
    关于java环境变量配置出现javac命令无法运行的解决办法
    关于QQ农场牧场等曾经流行的游戏的一些见解
    个人博客九
    个人博客八
    个人博客七
    个人博客六
    第十一周学习进度
    个人博客五
    个人博客四
  • 原文地址:https://www.cnblogs.com/HL-space/p/10546599.html
Copyright © 2011-2022 走看看