单链表可以说是基础,有利于对指针的使用
结点:
typedef int DataType;
typedef struct SlistNode
{
DataType data;
SlistNode* next;
}SListNode;
实现的函数的声明如下:
SListNode* _BuyNode(DataType x);
void PrintSlist(SlistNode* pHead);
void PushBack(SListNode** pHead, DataType x);
void PopBack(SlistNode*& pHead);
void PushFront(SlistNode*& pHead, DataType x);
void PopFront(SlistNode*& pHead);
SlistNode* Find(SlistNode* pHead, DataType x);
void Insert(SlistNode* pos, DataType x);
void Erase(SListNode*& pHead, SlistNode* pos);
具体实现如下:
SListNode* _BuyNode(DataType x)
{
SlistNode* tmp = (SListNode*)malloc(sizeof(SlistNode));
tmp->data = x;
tmp->next = NULL;
return tmp;
}
void PrintSlist(SlistNode* pHead)
{
SListNode* cur = pHead;
while (cur)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
void PushBack(SListNode** pHead, DataType x)
{
assert(pHead != NULL);
if (*pHead == NULL)
{
*pHead = _BuyNode(x);
}
else
{
SlistNode* cur = *pHead;
while (cur->next)
{
cur = cur->next;
}
SlistNode* tmp = _BuyNode(x);
cur->next = tmp;
}
}
void PopBack(SlistNode*& pHead)
{
if (pHead == NULL)
{
return;
}
else if (pHead->next == NULL)
{
free(pHead);
pHead = NULL;
}
else
{
SlistNode* tmp = pHead->next;
free(pHead);
pHead = tmp;
}
}
void PushFront(SlistNode*& pHead, DataType x)
{
if (pHead == NULL)
{
pHead = _BuyNode(x);
}
else
{
SListNode* tmp = pHead;
pHead = _BuyNode(x);
pHead->next = tmp;
}
}
void PopFront(SlistNode*& pHead)
{
if (pHead == NULL)
{
return;
}
else if (pHead->next == NULL)
{
free(pHead);
pHead = NULL;
return;
}
else
{
SListNode* tmp = pHead->next;
free(pHead);
pHead = tmp;
}
}
SlistNode* Find(SlistNode* pHead, DataType x)
{
SlistNode* cur = pHead;
while (cur)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void Insert(SlistNode* pos, DataType x)
{
assert(pos);
SListNode* next = pos->next;
SlistNode* tmp = _BuyNode(x);
pos->next = tmp;
tmp->next = next;
}
void Erase(SListNode*& pHead, SlistNode* pos)//删除的时候判断:1、删除的是否为头结点2.删除的不是头结点
{
assert(pHead);
assert(pos);
if (pHead == pos)
{
PopFront(pHead);
}
else
{
SListNode* cur = pHead;
SListNode* prev = pHead;
while (cur)
{
prev = cur;
cur = cur->next;//上面已经保证cur!=NULL
if (cur == pos)
{
SlistNode* next = cur->next;//因为上面已经保证pos不为NULL
prev->next = next;
free(cur);
return;//Y一定要记得这句话
}
}
}
}
测试用例:
只写Erase的测试用例
void Test()
{
SListNode* list1 = NULL;
PushBack(&list1, 1);
PushBack(&list1, 2);
PushBack(&list1, 3);
PushBack(&list1, 4);
PushBack(&list1, 5);
PrintSlist(list1);
Erase(list1, list1->next);
PrintSlist(list1);
Erase(list1, list1->next);
PrintSlist(list1);
Erase(list1, list1->next);
PrintSlist(list1);
Erase(list1, list1->next);
PrintSlist(list1);
Erase(list1, list1);
PrintSlist(list1);
}