结点的增删改查

struct Mydate //结构体里有3个变量
{
    int  price1;
    int price2;
    int price3;
};

struct  LIstNode //结构体有2个结构体变量(1个为了引用别的结构体的变量,一个为了得到下一个值)
{
    struct Mydate stu;
    LIstNode * pNext;//定义的一个得到下一个值得变量
};

LIstNode * Creatdata() //取值方法
{
    LIstNode * pTeahead = NULL;//头结点
    LIstNode * pTeaPre = NULL;//前一个结点
    LIstNode * pTeadMy = NULL;//空间结点
    int nlen = sizeof(Teacher);//把teacher的大小存起来,后面可以要用
    for (int i = 1;i <= 4;i++)
    {
        for (int j = 1;j <= 4;j++)
        {
            for (int z = 1;z <= 4;z++)
            {
                if (z != i && z != j && j != i)
                {
                    pTeadMy = new LIstNode ;//创新空间
                    pTeadMy->pNext = NULL;//给创建的空间初始化
                    if (pTeadMy != NULL)//空间不为空时进入
                    {

                        //分别对空间内的变量赋值
                        pTeadMy->stu.price1 = i;
                        pTeadMy->stu.price2 = j;
                        pTeadMy->stu.price3 = z;
                    }

                    if (pTeaPre == NULL)//如果它的前一个为空,那么说明它是第一个结点
                    {
                        pTeahead = pTeadMy;//把现在的结点赋给首结点
                    }
                    else//否则就是第二个结点及第二个结点以后的结点
                    {
                        pTeaPre->pNext = pTeadMy;当前的结点赋给前一个结点的下一个
                    }
                    pTeaPre = pTeadMy;当前结点给上一个结点,为了遍历值
                }
            }
        }
    }
    return pTeahead;//返回头结点
}

bool Find(int nValue, LIstNode * pFindeHead)//查结点(要查询的值,和头结点)
{

   //得到要查的各个变量的值
    int nX = nValue /100;
    int nY = (nValue / 10) % 10;
    int nZ = nValue % 10;
    LIstNode * pCurr=NULL;//初始化当前结点

    while (pCurr)//while循环当pCurr!=null
    {
        if (pCurr->stu.price1 == nX && pCurr->stu.price2 == nY && pCurr->stu.price3 == nZ)//判断是否找到结点
        {
            return true;
            printf("恭喜您,找到该数据所对应的结点");
        }
        else
        {
            return false;
            printf("很抱歉,未找到该数据所对应的结点");
        }
    }
}

LIstNode * DeleteTeacher(int nDelrte,LIstNode * pDelTeacher) //删除(要删除的值,和头结点)
{

//得到要删除的各个变量的值
        int nX = nDelrte / 100;
        int nY = (nDelrte / 10) % 10;
        int nZ = nDelrte % 10;
        LIstNode * pCurr = pDelTeacher;//存起来

      LIstNode* pSrcHeader =pSrcHeader ;//存起来
        LIstNode * pPre = NULL;//当前结点的前一个

        while (pCurr)
        {
            if (pCurr->stu.price1 == nX && pCurr->stu.price2 == nY && pCurr->stu.price3 == nZ)//判断找到结点
            {

if (pPre==NULL)//删掉头结点的情况
                {
                    pPre = pCurr->pNext;//把当前的下一个给到当前的上一个
                    pSrcHeader = pCurr->pNext;//定义一个头结点来接收
    
                }

                 else
                pPre->pNext = pCurr->pNext;//把当前结点的下一个结点给到当前结点的上一个的下一个,为了把结点链接起来


                delete pCurr;//删除当前结点
                pCurr = pPre;//把前一个结点给到当前结点(可以有效解决有和我们要删除的结点相同的结点,也可以一起删除)


                //return     pCurr;//可以之间返回当前结点的,但是不能够去判断后面是否还会有
            }
            pPre = pCurr;//把当前结点的值给到前一个结点(不论你是否是找到的值我们都会经过这个过程)
            printf("%d%d%d\n", pCurr->stu.price1, pCurr->stu.price2, pCurr->stu.price3);//打印值
            pCurr = pCurr->pNext;//把当前结点的下一个值给到当前结点
        
            //free(pDelTeacher);//释放
        }
        return pSrcHeader ;//返回这个头结点
}

LIstNode * AddTeacher(int nValue1, LIstNode * pAddHead, int Add)//增加(要找到的值,头结点还有要增加的值)
{

//得到要在那个结点的各个变量的值
    int nX = nValue1 / 100;
    int nY = (nValue1 / 10) % 10;
    int nZ = nValue1 % 10;

//得到要增加的各个变量的值

    int Addx = Add / 100;
    int Addy = (Add / 10) % 10;
    int Addz = Add % 10;

    LIstNode * pCurr = pAddHead;//当前指针
    LIstNode * pAdd = NULL; //新增指针
    LIstNode * pPre = NULL;//上一个指针
    while (pCurr!=NULL)//当前指针不为空
    {
        if (pCurr->stu.price1 == nX && pCurr->stu.price2 == nY && pCurr->stu.price3 == nZ)//判断找到结点
        {
            pAdd = new LIstNode ;//创建一个空间
            pAdd->pNext = NULL;//给空间初始化

             //给增加的空间赋值
            pAdd->stu.price1 = Addx;
            pAdd->stu.price2 = Addy;
            pAdd->stu.price3 = Addz;

            //增加不用看是否为头结点

            pAdd->pNext = pCurr->pNext;//把当前的下一个结点放在增加的结点后
                pCurr->pNext = pAdd;//把创建的结点给到当前结点的下一个
            }
        }

        //方便遍历
        pPre = pCurr;//当前结点给到前一个结点
        pCurr = pCurr->pNext;//当前结点的下一个给到当前结点
    }
    return pAdd;//第三种情况没有找到的时候
}

LIstNode * UpsetTeacher(int nValue1, LIstNode * pUpsetHead, int Upset)//修改(要找到的值,头结点还有要修改的值)
{
    int nX = nValue1 / 100;
    int nY = (nValue1 / 10) % 10;
    int nZ = nValue1 % 10;

   //要修改的值的各个变量

    int Upsetx = Upset / 100;
    int Upsety = (Upset / 10) % 10;
    int Upsetz = Upset % 10;
    LIstNode * pCurr = pUpsetHead;//当前指针
    LIstNode * pUpset = NULL; //修改指针
    LIstNode * pPre = NULL;//前一个指针
    while (pCurr != NULL)
    {//当前指针
        if (pCurr->stu.price1 == nX && pCurr->stu.price2 == nY && pCurr->stu.price3 == nZ)//找到了结点
        {

              //对要修改的各个变量赋值
            pCurr->stu.price1 = Upsetx;
            pCurr->stu.price2 = Upsety;
            pCurr->stu.price3 = Upsetz;
        }
        printf("%d%d%d\n",pCurr->stu.price1,pCurr->stu.price2,pCurr->stu.price3);//打印
        pCurr = pCurr->pNext;//当前结点的下一个赋给当前结点
    }
    return pUpsetHead;返回头结点
}

int main()
{

  //
    int nA = 231;
    int nB = 999;
    int nC = 321;
    int nD = 666;
    LIstNode * ter=Creatdata();
    Find(nA, ter);//查找
    LIstNode * pHeader = DeleteTeacher(213, ter);//删除
    while (pHeader)
    {
        printf("%d%d%d\r\n", pHeader->stu.price1, pHeader->stu.price2, pHeader->stu.price3);
        pHeader = pHeader->pNext;
    }
    pHeader = AddTeacher(nA, ter, nB);//添加
    while (pHeader)//while循环当pHeader!=null;
    {
        printf("%d%d%d\r\n", pHeader->stu.price1, pHeader->stu.price2, pHeader->stu.price3);//打印
        pHeader = pHeader->pNext;
    }
    pHeader = UpsetTeacher(nA, ter, nD);//修改
    while (pHeader)
    {
        printf("%d%d%d\r\n", pHeader->stu.price1, pHeader->stu.price2, pHeader->stu.price3);
        pHeader = pHeader->pNext;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值