zoukankan      html  css  js  c++  java
  • 数据结构中点链表的插入操作

    Status listinsert(Linklist &L,int i,ElemType e)//bool  vs  status :在函数需要有返回值的时候,既可以使用bool也可以使用,使用bool的时候,在需要判断的语句后面加上return      //true,return false.这样就可以了。不像使用status,还需要加上typedef int status#define ERROR -1#define OK 1.  结论:所以在有需要返回值的函数中我自己会使用相对简单的bool类型。

    // c语言中一般没有status这个关键字,但一般写程序时,会定义这样一个类型,用来表示成功或失败状态。如:0表示成功,-1表示失败。这样status就可以定义成int类型。如:

    /*typedef int status;

    #define ERROR -1

    #define OK 1

    然后用它去定义变量或函数返回值类型,如:

    status func(int n)//判断非负数

    {

    if(n>=0)

    return ERROR;

    else

    return OK;

    }*/

    //在数据结构中,关于数据元素的定义俊用“ElemType e”来表示,其实e是表示数据元素的变量,而ElemType是它的类型,ElemType的含义就是“数据元素的类型”,是一个抽象的概念,是表示我们所要使用的数据元素应有的类型。

    ElemType是数据结构上为了说明问题而用的一个词。它是element type(元素的类型)的简化体。 因为数据结构是讨论抽象的数据结构和算法,一种结构中元素的类型不一定是整形,字符型,浮点型或者用户自定义类型,为了不重复说明,使用过程用“ElemType”代表所有可能的数据类型,简单明了的概括整体。

    在算法中,除特别说明外,规定ElemType的默认是int型。

    //bool型说明在函数调用这个函数之后的返回值要么是true,要么是false.括号中的都是形参,头指针L采用了引用,整型变量ie用来接收用户传来的数据。

    {

         p=L; j=0;//p指向头结点,并定义一个整形变量j的值为0.定义了结点型指针变量p,并且与L的指向相同,它们两个同时指向头结点。并且定义整形变量j的值等于0.

    while(p&&j<i-1)//如果要在第n个结点进行插入数据,则需要先找到这个节点.这里使用的是与符号&,表示的是只有两个条件都满足的时候循环才能进行。

    由于j0开始,从0i-1一共有i-1+1i个数,而在j等于i-2i-1个数的时候停止。在这里while循环的条件是结点型指着变量所指向的结点不为空的时候并且j小于i-1的时候循环继续执行。这个循环的目的是为了将结点型指针变量p指向第i-1结点的位置。

        {

            p=p->next;//P指向后一个结点循环进来以后首先将p指向p的下一个结点。

            j++;//j的值自增1.

        }//这个循环的目的是让pj一齐后移,不断的接近条件的边界。

    if(!p||j>i-1)//i<1或者i>ListLength(L)+1时,插入位置无效。不调用ListLength,提高效率。//if条件语句中的条件是一个或||,它只要有一个条件满足if语句就可以继续执行。也就是p只要为空,或者j的数值大于i-1的时候就可以继续执行。{

        cout<<"i is error!";//输出i is error!这句话。对于条件中直观的解释就是如果,p指到了最后一个结点的后面(这是因为结点的数目太少)或者是i<1.如果i的值是负数,或者i-1的值大于单链表的长度,即都是用户输入i值得错误将会导致插入失败。会提醒i is error!

        return ERROR;

    }//if语句的主要作用就是为了给出来一个信号以及提高算法的健壮性。如果i的值用户输入了-1则会提醒出错。如果p的值为空了同样也会提示出错。p指向的结点为空说明p已经指向了表尾了还没指向i-1的位置。说明i-1的值过大。j>i-1说明用户输入的i值是非正数。

     //能够执行到这一步说明已经找到了第i-1个结点,接下来就是正式的生成插入的操作了。

    LinkList s=new Lnode();//开辟一个新的结点空间,并定义一个结构体指针变量s指向它。

    s->data=e;//把新结点的数值域赋值为e.

    s->next=p->next;//p->next表示的是第i个结点的地址值,s->next指的是新申请的结点的指针域,也就是把第i个结点的地址值放到新结点的指针域里面,新的结点指向第i个结点。

    p->next=s;//这里的p-next指的是第i-1个结点的指针域,s指的是新申请结点的地址值。这步操作就是把新结点的地址值放到第i-1个结点的指针域里面。也就是第i-1个结点指向新申请的结点。  这个操作完成之后就把插入操作给完成了。之前的第i-1个结点还是第i-1个结点,新申请的结点就变成第i个结点了,而之前的第i个结点就变成了第i+1个结点。

    return OK;//在这一切完成以后返回1,因为OK定义的数值就是1,说明插入成功。

    }

  • 相关阅读:
    226. 翻转二叉树-leetcode
    2的幂-leetcode
    使用 orgmode 写博客园博客
    这是一个通过Emacs Orgmode的cnblogs插件发布的博客
    测试设计的初探
    项目微管理29
    2018091-2 博客作业
    软件工程项目课题和小组成员介绍
    (项目)在线教育平台(三)
    svn 迁移至git操作手册
  • 原文地址:https://www.cnblogs.com/SuperAx/p/13194528.html
Copyright © 2011-2022 走看看