有空头链表
查找指定节点
查找节点数据
思路大致都是一样的,找到节点是关键
思路
传参:查找节点,要传节点,头指针也要传
1.合法性判断
2.循环找数据
3.返回找到的数据
具体代码
struct Chain *FindiData(struct Chain*pHead, int iData)
{
if (NULL == pHead)
return NULL;
struct Chain *pTemp = pHead->pNext;
while (pTemp != NULL)
{
if (pTemp->iData = iData)
break;
pTemp = pTemp->pNext;
}
if (NULL == pTemp)
return NULL;
return pTemp;
}
查找节点下标
思路
1.传参:这里就要 传节点下标了
2.合法性检测
3.查找节点
具体代码
struct Chain *FindiIndex(struct Chain *pHead, int Index)
{
if (NULL == pHead || Index < 0)
return NULL;
struct Chain *pTemp = pHead->pNext;
int Sign = 0;
while (pTemp != NULL)
{
if (Sign == Index)
return pTemp;
pTemp = pTemp->pNext;
Sign++;
}
return NULL;
}
其实合法性检测时,要让Index<*iCount
才是最完善的,由于我懒癌发作,就姑且先算了吧,你们不要忘了哈
修改指定节点
通过查找下标修改
思路
1.合法性检测
2.查找
3.修改
4.如此简单,不想都会,但又何止要想
具体代码
void MoidiData2(struct Chain *pHead,int Index,int iData,int *iCount)
{
//参数合法性检测
if (NULL == pHead || Index < 0 || Index > *iCount)
return;
//查找
struct Chain *pTemp = FindiIndex(pHead,Index);
if (pTemp == NULL)
return;
//修改
pTemp->iData = iData;
}
通过查找数据修改多个节点
思路
1.参数合法性检测
2.循环找节点,在循环里修改,并不断继续找,就能达到修改多个节点的效果
3.是不是只是复习知识点呢,亲!
具体代码
void ModiData1(struct Chain *pHead, int iData, int Data)
{
if (NULL == pHead)
return;
struct Chain *pTemp = pHead->pNext ;
while (NULL != pTemp)
{
if (iData == pTemp->iData)
pTemp->iData = Data;
pTemp = pTemp->pNext;
}
if (pTemp == NULL)
return;
}
删除指定节点
根据下标删除指定节点
思路
1.参数合法性检测
2.利用根据下标查找节点的函数来查找要删除的前一个节点
3.指针指向要删除的节点,记录位置
4.重新指向
5.释放节点,即删除
6.数量要减
具体代码
void DeleteMore(struct Chain *pHead,int iData,int *iCount)
{
if (NULL == pHead)
return;
struct Chain *pTemp = pHead;
while (NULL != pTemp->pNext )
{
if (pTemp ->pNext ->iData == iData)
{
struct Chain *pT = pTemp ->pNext ;
pTemp->pNext = pT->pNext;
pT->pNext = NULL;
free(pT);
(*iCount)--;
continue;
}
pTemp = pTemp->pNext;
}
}
删除所有指定的数据
思路
1.合法性检测
2.循环遍历链表,判断是否相等
3.断开链表,释放链表
具体代码
void DeleteMore(struct Chain *pHead,int iData,int *iCount)
{
if (NULL == pHead)
return;
//循环遍历
struct Chain *pTemp = pHead;
while (NULL != pTemp->pNext )
{
if (pTemp ->pNext ->iData == iData)
{
struct Chain *pT = pTemp ->pNext ;
pTemp->pNext = pT->pNext;
pT->pNext = NULL;
free(pT);
(*iCount)--;
continue;
}
pTemp = pTemp->pNext;
}
}
链表的去重
去重:除去相同的数据,即链表中仅有唯一相同的数据
思路
1.合法性检测:用到去重的话,肯定是有两个一样的情况,所以节点就要保证在两个以上
2.去重就要找两个节点,进行比较,可以标记两个节点,进行循环嵌套,就可以达到去重的结果
具体代码
void RemoveDup(struct Chain *pHead,int *iCount)
{
if (NULL == pHead || NULL == pHead->pNext)
return;
struct Chain *pTemp = pHead->pNext ;
while (NULL != pTemp)
{
struct Chain *pT = pTemp ;
while (NULL != pT->pNext )
{
if (pTemp->iData == pT->pNext ->iData)
{
struct Chain *Remove = pT->pNext ;
pT->pNext = Remove->pNext;
free(Remove);
(*iCount)--;
continue;
}
pT = pT->pNext;
}
pTemp = pTemp->pNext;
}
}