您的位置:首页 > 运维架构

单链表的PushBack,PopBack,Insert...函数

2015-10-20 11:43 387 查看
单链表的熟悉使用,注意测试用例的全面
//使用引用的作用等同于使用二级指针,在传递指针时
//传引用是可能改变Link,而有的函数只需改变->next,此时不需传引用
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<assert.h>
typedef int  DataType;
typedef struct LinkNode
{
DataType  _data;//节点数据
struct   LinkNode* _next;//指向下一个节点的指针
}LinkNode, *PLinkNode;
void  InitList(PLinkNode& PLinkhead);//初始化
void  PrintList(PLinkNode PLinkhead);//打印
int  GetLinkNode(PLinkNode PLinkhead);//获取节点数
void DestoryNode(PLinkNode& PLinkhead);//销毁链表
void  PushBack(PLinkNode& PLinkhead, DataType x);//尾插
void  PopBack(PLinkNode& PLinkhead);//尾删
void  PushFront(PLinkNode& PLinkhead, DataType x);//头插
void  PopFront(PLinkNode& PLinkhead);//头删
PLinkNode Find(PLinkNode PLinkhead, DataType x);//查找x的位置
void  Erase(PLinkNode& PLinkhead, PLinkNode pos);//删除pos处的节点
void  EraseNoTaiNode(PLinkNode  pos);//无头指针删除,可采用拷贝下一个结点数据,删除下一个结点
void  Insert(PLinkNode pos, DataType x);//在pos后面插入一个节点
void  Remove(PLinkNode& PLinkhead, DataType x);//删除链表中的第一个x
void  RemoveAll(PLinkNode& PLinkhead, DataType x);//删除链表中所有的x
void  Test();//测试
PLinkNode  BuyNode(DataType x);//开辟PLinkNode空间存储x

PLinkNode  BuyNode(DataType x)
{
PLinkNode tmp;
tmp=(PLinkNode)malloc(sizeof(LinkNode));
tmp->_data = x;
tmp->_next = NULL;
return  tmp;
}
void  InitList(PLinkNode& PLinkhead)
{
PLinkhead = NULL;
}
void  PrintList(PLinkNode PLinkhead)
{
PLinkNode cur=PLinkhead;
while (cur != NULL)
{
printf("%d->", cur->_data);
cur = cur->_next;
}
printf("NULL\n");
}
int  GetLinkNode(PLinkNode PLinkhead)
{
int count = 0;
PLinkNode cur = PLinkhead;
while (cur != NULL)
{
count++;
cur = cur->_next;
}
return count;
}
void DestoryNode(PLinkNode& PLinkhead)
{
PLinkNode del = PLinkhead;
while (PLinkhead!= NULL)
{
del = PLinkhead;
PLinkhead = PLinkhead->_next;
free(del);
}
}
void  PushBack(PLinkNode& PLinkhead, DataType x)
{
if (PLinkhead == NULL)
{
PLinkhead = BuyNode(x);
}
else
{
PLinkNode end =PLinkhead;
while (end->_next != NULL)
{
end = end->_next;
}
end->_next = BuyNode(x);
}
}
void  PopBack(PLinkNode& PLinkhead)
{
if (PLinkhead == NULL)
{
return;
}
else if (PLinkhead->_next == NULL)
{
free(PLinkhead);
PLinkhead = NULL;
}
else
{
PLinkNode end=PLinkhead,pre=NULL;
while (end->_next != NULL)
{
pre = end;
end = end->_next;
}
pre->_next = NULL;
free(end);
}
}
void  PushFront(PLinkNode& PLinkhead, DataType x)
{
if (PLinkhead == NULL)
{
PLinkhead = BuyNode(x);
}
else
{
PLinkNode start = BuyNode(x);
start->_next = PLinkhead;
PLinkhead = start;
}
}
void  PopFront(PLinkNode& PLinkhead)
{
if (PLinkhead == NULL)
{
return;
}
else if (PLinkhead->_next == NULL)
{
free(PLinkhead);
PLinkhead = NULL;
}
else
{
PLinkNode end = PLinkhead;
PLinkhead = PLinkhead->_next;
free(end);
}
}
PLinkNode Find(PLinkNode PLinkhead, DataType x)
{
PLinkNode  cur = PLinkhead;
while (cur)
{
if (cur->_data == x)
return cur;
else
cur = cur->_next;
}
return NULL;
}
void  Erase(PLinkNode& PLinkhead, PLinkNode pos)
{
assert(pos);
PLinkNode  pre = PLinkhead;
assert(pos);
if (pos == PLinkhead)
{
PLinkhead = pos->_next;
free(pos);
}
else
{
while (pre&&pre->_next != pos)
{
pre = pre->_next;
}
if (pre)
{
pre->_next = pos->_next;
free(pos);
}
else
printf("为找到此位置\n");
}

}
void  EraseNoTaiNode(PLinkNode pos)//删除一个非尾节点的无头节点
{
PLinkNode del = pos->_next;//保存pos的下一节点
pos->_data = pos->_next->_data;
pos->_next = del->_next;
free(del);
}
void  Insert(PLinkNode pos, DataType x)//在pos后面插入x
{
PLinkNode cur = BuyNode(x);
if (pos == NULL)
{
printf("插入位置错误\n");
return;
}
cur->_next = pos->_next;
pos->_next = cur;
}
void  Remove(PLinkNode& PLinkhead, DataType x)
{
PLinkNode  cur = PLinkhead,pre=NULL;
if (PLinkhead->_data == x)
{
PLinkhead=PLinkhead->_next;
free(cur);
}
else
{
while (cur&&cur->_data != x)
{
pre = cur;
cur = cur->_next;
}
if (cur)
{
pre->_next= cur->_next;
free(cur->_next);
}
}
}
void  RemoveAll(PLinkNode& PLinkhead, DataType x)
{
PLinkNode cur = PLinkhead, pre = NULL;
if (cur->_data == x)
{
PLinkhead = PLinkhead->_next;
free(cur);
}
cur = PLinkhead;
while (1)
{
while (cur&&cur->_data != x)
{
pre = cur;
cur = cur->_next;
}
if (cur)
{
pre->_next = cur->_next;
free(cur);
cur = pre->_next;
}
else
return;
}

}

void  Test()
{
PLinkNode Link;
InitList(Link);
PushBack(Link,3);
PushBack(Link, 2);
PushBack(Link, 3);
PushBack(Link, 4);
PrintList(Link);

PushFront(Link, 5);
PushFront(Link, 6);
PushFront(Link, 7);
PrintList(Link);

EraseNoTaiNode(Find(Link, 2));
PrintList(Link);

Insert(Find(Link, 2), 5);
PrintList(Link);
Insert(Find(Link, 3), 5);
PrintList(Link);

Remove(Link, 1);
Remove(Link, 4);
PrintList(Link);

RemoveAll(Link, 3);
PrintList(Link);

DestoryNode(Link);
PrintList(Link);

}

int main()
{
Test();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单链表