初步了解
链表是一种常见的重要数据结构,可以动态地进行存储分配
头指针head存放一个地址,该地址指向一个元素
链表中每个元素称为结点,每个结点包括两部分,用户需要用的实际数据和下一个结点的地址
最后一个元素不再指向其他元素它的地址存放一个NULL(空地址)
先建立一个链表
typedef struct connect_NODE
{
int value;
struct connect_NODE* next;
}NODE,*PNODE;
int main()
{
PNODE pHead = NULL;
InsertHead(&pHead, 1);
InsertHead(&pHead, 2);
InsertHead(&pHead, 3);
InsertHead(&pHead, 4);
/*PNODE pPos = FindPosByIndex(pHead, 2);
if (pPos != NULL)
{
pPos->value = 5;
}*/
Show(pHead);
return 0;
}
输出链表
void Show(const PNODE pHead)
{
PNODE pPos = pHead;
while (pPos != NULL)
{
printf("%d,", pPos->value);
pPos = pPos->next;
}
puts("\b;");
}
进行头插
void insertHead(PNODE * ppHead, int value)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));//野指针,应先申请空间
pNew->value = value;
pNew->next = *ppHead;
*ppHead = pNew;
}
进行尾插
void InsertTail(PNODE*ppHead, int value)
{
if (NULL == *ppHead)
{
InsertHead(ppHead, value);
}
else
{
PNODE pPos = *ppHead;
while (pPos->next != NULL)
{
pPos = pPos->next;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->value = value;
pNew->next = NULL;
pPos->next = pNew;
}
}
进行头删
void DeleteHead(PNODE*ppHead)
{
if (*ppHead != NULL)
{
PNODE pPos = *ppHead;
*ppHead = pPos->next;
free(pPos);
pPos = NULL;
}
}
进行尾删
void DeleteTail(PNODE*ppHead)
{
if (NULL == *ppHead || NULL == (*ppHead)->next)
{
DeleteHead(ppHead);
}
else
{
PNODE pPos = *ppHead;
while (pPos->next->next != NULL)
{
pPos = pPos->next;
}
free(pPos->next);
pPos->next = NULL;
}
}
找要插的下标
PNODE FindPosByIndex(PNODE pHead, unsigned int index)
{
PNODE pRet = pHead;
int i = 0;
while (i < index && pRet != NULL)
{
pRet = pRet->next;
i++;
}
return pRet;
}
PNODE FindPosByValue(PNODE pHead, int value)
{
PNODE pRet = NULL;
return pRet;
}
插入下标
int UpdateByIndex(PNODE pHead, unsigned int index, int value)
{
int iRet = 0;
PNODE pPos = FindPosByIndex(pHead, index);
if (pPos != NULL)
{
pPos->value = value;
iRet = 1;
}
return iRet;
}
插入值
int UpdateByValue(PNODE pHead, int oldValue, int newValue)
{
int iRet = 0;
PNODE pPos = FindPosByValue(pHead, oldValue);
while (pPos != NULL)
{
pPos->value = newValue;
pPos = FindPosByValue(pPos->next, oldValue);
iRet = 1;
}
return iRet;
}
清空
void Clear(PNODE* ppHead)
{
while (*ppHead != NULL)
{
DeleteHead(ppHead);
}
}
翻转
void Reverse(PNODE * ppHead)
{
if (!(NULL == *ppHead || NULL == (*ppHead)->next))
{
PNODE p1, p2, p3;
p1 = *ppHead;
p2 = p1->next;
p3 = p2->next;
p2->next = p1;
while (p3 != NULL)
{
p1 = p2;
p2 = p3;
p3 = p3->next;
p2->next = p1;
}
(*ppHead)->next = NULL;
*ppHead = p2;
}
}