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;
}