您的位置:首页 > 编程语言 > C语言/C++

c语言实现单链表的及各项基本功能

2017-06-22 17:12 731 查看
单链表的各项基本功能都在以下的函数中实现
//录入数据
ListNode* BuyNode(DataType x)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->data = x;
node->next = NULL;
return node;
}

//打印
void PrintList(ListNode* pList)
{
ListNode* cur = pList;
while (cur)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL");
}

//尾插
void PushBack(ListNode** ppList, DataType x)
{
//1,空
//2,非空
if (*ppList == NULL)
{
*ppList = BuyNode(x);
}
else
{
ListNode* tail = *ppList;
while (tail->next)
{
tail = tail->next;
}
tail->next = BuyNode(x);
}

}

//尾删
void PopBack(ListNode** ppList)
{
//1,空
//2,一个
//3,多个
if ((*ppList) == NULL)//空
{
return;
}
else if ((*ppList)->next == NULL)//一个
{
free(*ppList);
*ppList = NULL;
}
else//多个
{
ListNode* prev = NULL;
ListNode* tail = *ppList;
while (tail->next)
{
prev = tail;
tail = tail->next;
}
free(tail);
tail = NULL;
prev->next = NULL;//让上一个结点的next置空
}
}

//头插
void PushFront(ListNode** ppList, DataType x)
{
//1,空
//2,非空
if ((*ppList) == NULL)
{
*ppList = BuyNode(x);
}
else
{
ListNode* tmp = *ppList;
*ppList = BuyNode(x);
(*ppList)->next = tmp;
}
}

//头删
void PopFront(ListNode** ppList)
{
//1,空
//2,一个
//3,多个
if ((*ppList) == NULL)
{
return;
}
else if ((*ppList)->next == NULL)
{
free(*ppList);
*ppList = NULL;
}
else
{
ListNode* tmp = *ppList;
*ppList = tmp->next;
free(tmp);
}
}

//查找
ListNode* Find(ListNode* pList, DataType x)
{
ListNode* cur = pList;
while (cur)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}

// 在pos的前面插入一个节点x
void Insert(ListNode** ppList, ListNode* pos, DataType x)
{
assert(ppList);
assert(pos);
//1,头插
//2,中间插入
if ((*ppList)->next == NULL)
{
PushFront(ppList,x);
}
else
{
ListNode* prev = *ppList;
while (prev->next != pos)
{
prev = prev->next;
}
ListNode* tmp = BuyNode(x);
prev->next = tmp;
tmp->next = pos;
}
}

//删除
void Erase(ListNode** ppList, ListNode* pos)
{
//1,头
//2,尾
//3,中间
assert(pos);
if (*ppList == pos)
{
PopFront(ppList);
}
else if (pos->next == NULL)
{
PopBack(ppList);
}
else
{
ListNode* prev = *ppList;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: