创建两个结构体是为了简单,避免二级指针。
// 节点结构
typedef struct SListNode
{
SData data;
struct SListNode* pNext;
}Node;
// 给一个链表结构
typedef struct SList
{
Node* pHead;
}SList;
创造一个新结点
SData* MakeNewNode(SData d)
{
Node* NewData = (Node*)malloc(sizeof(Node) * 10);
if (NULL == NewData)
{
perror("NewDaTa::malloc");
return;
}
NewData->data = d;
NewData->pNext = NULL;
return NewData;
}
在链表中尾插值为data的节点
void SListPushBack(SList* p, SData d)
{
assert(p);
Node* cur = NULL;
cur = p->pHead;
Node* NewData = MakeNewNode(d);
if (NULL == cur)
{
p->pHead = NewData;
NewData->pNext = NULL;
return;
}
while (cur->pNext)
{
cur = cur->pNext;
}
cur->pNext = NewData;
NewData->data = d;
NewData->pNext = NULL;
}
在链表第一个元素前插入值为d的节点
void SListPushFront(SList* p, SData d)
{
assert(p);
Node* NewData = MakeNewNode(d);
NewData->pNext = p->pHead;
p->pHead = NewData;
}
删除链表中所有值为d的元素
void SListRemoveAll(SList* p, SData d)
{
assert(p);
Node* pCur = p->pHead;
Node* pPre = NULL;
while (pCur)
{
if (pCur->data == d)
{
if (pCur == p->pHead)
{
p->pHead = pCur->pNext;
free(pCur);
pCur = p->pHead;
}
else
{
pPre->pNext = pCur->pNext;
free(pCur);
pCur = pPre->pNext;
}
}
else
{
pPre = pCur;
pCur = pCur->pNext;
}
}
}