#include <stdio.h>
#include <stdlib.h>
typedef int DT;
typedef struct node
{
DT data;
struct node * pNext;
} Node, * pNode;
pNode CreateList(void);
void DelelteList(pNode);
void DeleteByData(pNode, DT);
void DeleteByIndex(pNode, int);
DT FindDataByIndex(pNode pCurr, int index);
void Insert(pNode, int, DT);
void PrintList(pNode);
void UpdateByIndex(pNode, int, DT);
int main(void)
{
pNode pHead = CreateList();
Insert(pHead, 0, 134);
Insert(pHead, 1, 345);
Insert(pHead, 2235, 234);
PrintList(pHead);
Insert(pHead, 222220, 285);
PrintList(pHead);
DeleteByIndex(pHead, 2);
PrintList(pHead);
//DeleteByIndex(pHead, 2345);
//DeleteByIndex(pHead, 1);
//DeleteByIndex(pHead, 1);
//DeleteByIndex(pHead, 1);
//PrintList(pHead);
//DeleteByData(pHead, 285);
//PrintList(pHead);
//DeleteByData(pHead, 34444);
//PrintList(pHead);
UpdateByIndex(pHead, 2, 3333);
PrintList(pHead);
printf("%d\n", FindDataByIndex(pHead, 3));
DelelteList(pHead);
return 0;
}
pNode CreateList()
{
pNode pHead = (pNode)malloc(sizeof(Node));
pHead->pNext = NULL;
return pHead;
}
void DelelteList(pNode pCurr)
{
if (pCurr != NULL)
{
pNode pTemp = pCurr;
pCurr = pCurr->pNext;
free(pTemp);
DelelteList(pCurr);
}
}
// 想插入到链表结尾,给index赋以不溢出的大值即可
void Insert(pNode pCurr, int index, DT data)
{
static int i = 0;
if ((index == i++) || (pCurr == NULL) || (pCurr->pNext == NULL))
{
pNode pNew = (pNode)malloc(sizeof(Node));
pNew->data = data;
pNew->pNext = pCurr->pNext;
pCurr->pNext = pNew;
i = 0;
}
else
Insert(pCurr->pNext, index, data);
}
// 索引不正确时会返回-1
DT FindDataByIndex(pNode pCurr, int index)
{
static int i = 1;
if (pCurr->pNext == NULL)
return -1;
if (index == i++)
{
return pCurr->pNext->data;
}
else
FindDataByIndex(pCurr->pNext, index);
}
void UpdateByIndex(pNode pCurr, int index, DT data)
{
DeleteByIndex(pCurr, index);
Insert(pCurr, index - 1, data);
}
void DeleteByIndex(pNode pCurr, int index)
{
static int i = 1;
if ((0 >= index) || (pCurr == NULL) || (pCurr->pNext == NULL))
return;
if (index == i++)
{
pNode pTemp = pCurr->pNext;
pCurr->pNext = pCurr->pNext->pNext;
free(pTemp);
}
else
DeleteByIndex(pCurr->pNext, index);
i = 1;
}
void DeleteByData(pNode pCurr, DT data)
{
if((pCurr == NULL) || (pCurr->pNext == NULL))
return;
if(pCurr->pNext->data == data)
{
pNode pTemp = pCurr->pNext;
pCurr->pNext = pCurr->pNext->pNext;
free(pTemp);
}
DeleteByData(pCurr->pNext, data);
}
void PrintList(pNode pCurr)
{
if (pCurr == NULL)
return;
if (pCurr->pNext != NULL)
{
printf("%d\t", pCurr->pNext->data);
PrintList(pCurr->pNext);
}
else
{
printf("\n");
return;
}
}