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,说明插入成功。

    }

  • 相关阅读:
    17. Letter Combinations of a Phone Number
    16. 3Sum Closest
    15. 3Sum
    14. Longest Common Prefix
    13. Roman to Integer
    12. Integer to Roman
    11. Container With Most Water
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/SuperAx/p/13194528.html
Copyright © 2011-2022 走看看