链表—一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个结点
- 头指针:指向第一个结点的指针
- 头结点:数据域存放空表标志或表长,指针域存放第一个结点地址的结点
单链表的定义
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node, *pNode, List, *pList;
Node,List
*pNode,*pList;
单链表操作
初始化单链表
void InitLinkList(pList* pplist)
{
if (*pplist != NULL)
{
*pplist = NULL;
}
}
创建一个新节点
pNode LBuyNode(DataType d)
{
pNode plist =(pNode)malloc(sizeof(Node));
if (NULL == plist)
{
assert(0);
}
plist->data = d;
plist->next = NULL;
return plist;
}
打印单链表
void PrintLinkList(pList plist)
{
pList cur = plist;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
销毁单链表
void DestroyLinkList(pList* pplist)//销毁
{
assert(pplist);
while (*pplist != NULL)
{
pList cur = *pplist;
*pplist = (*pplist)->next;
free(cur);
cur = NULL;
}
}
尾部插入
void PushBack(pList* pplist, DataType d)
{
assert(pplist);
pNode plist = LBuyNode(d);
if (*pplist == NULL)
{
*pplist = plist;
}
else
{
pList cur = *pplist;
while(cur->next != NULL)
{
cur = cur->next;
}
cur->next = plist;
}
}
尾部删除
void PopBack(pList* pplist)
{
assert(pplist);
if(*pplist == NULL)
{
return;
}
else if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
pList cur = *pplist;
while (cur->next->next != NULL)
{
cur = cur->next;
}
free(cur->next);
cur->next = NULL;
}
}
头部插入
void PushFront(pList* pplist, DataType d)头部插入
{
assert(pplist);
pList plist = LBuyNode(d);
plist->next = *pplist;
*pplist = plist;
}
头部删除
void PopFront(pList* pplist)//头部删除
{
assert(pplist);
pList cur = *pplist;
*pplist = (*pplist)->next;
free(cur);
cur = NULL;
}
查找
pNode Find(pList plist, DataType d)
{
assert(plist);
pList cur = plist;
while (cur != NULL)
{
if (cur->data == d)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
在指定位置之前插入一个值
void Insert(pList* pplist, pNode pos, DataType d)//在指定位置之前插入一个值
{
assert(pplist&&pos&&*pplist);
pList plist = LBuyNode(d); //创建新结点
pList cur = *pplist;
while (cur->next != pos)
{
cur = cur->next;
}
plist->next = cur->next;
cur->next = plist;
}
删除指定位置元素
void Erase(pList* pplist, pNode pos)//删除指定位置元素
{
assert(pplist&&pos);
if (*pplist == NULL)
{
return;
}
else if ((*pplist) == pos)
{
*pplist = (*pplist)->next;
}
else
{
pList cur = *pplist;
while (cur &&cur->next != pos)
{
cur = cur->next;
}
cur->next = cur->next->next;
free(pos);
pos = NULL;
}
}
删除指定元素
void Remove(pList* pplist, DataType d)
{
assert(pplist);
if (*pplist == NULL)
{
return;
}
else if ((*pplist)->data == d)
{
pList cur = *pplist;
*pplist = (*pplist)->next;
free(cur);
cur = NULL;
}
else
{
pList cur = *pplist;
while (cur->next && cur->next->data != d)
{
cur = cur->next;
}
if (cur->next != NULL)
{
pList del = cur->next;
cur ->next= cur->next->next;
free(del);
del = NULL;
}
}
}
删除指定的所有元素
void RemoveAll(pList* pplist, DataType d)
{
assert(pplist);
if (*pplist == NULL)
{
return;
}
pList cur = *pplist;
pList sen = NULL;
while (cur)
{
if (cur->data == d)
{
if ((*pplist)==cur)
{
pList del = *pplist;
*pplist = (*pplist)->next;
cur = *pplist;
free(del);
del = NULL;
}
else
{
sen->next = cur->next;
free(cur);
cur= sen->next;
}
}
else
{
sen = cur;
cur = cur->next;
}
}
}