assert定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
如:assert(First)
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int DataType;
typedef struct SListNode {
DataType data; // 值
struct SListNode *Next; // 指向下一个结点
} SListNode;
// 初始化
void SListInit(SListNode **First)
{
assert(First);
*First= NULL;
}
//创建结点
SListNode * CreateNode(DataType data)
{
SListNode * NewNode = (SListNode *)malloc(sizeof(SListNode));
assert(NewNode);
NewNode->Next = NULL;
NewNode->data = data;
return NewNode;
}
// 尾部插入
void SListPushBack(SListNode** First, DataType data)
{
assert(First);
SListNode * NewNode = CreateNode(data);
if (*First == NULL)
{
*First = NewNode;
return;
}
else
{
SListNode * Node = *First;
for (Node; Node->Next != NULL; Node = Node->Next)
{}
Node->Next = NewNode;
}
}
// 头部插入
void SListPushFront(SListNode **First, DataType data)
{
assert(First);
SListNode * NewNode = CreateNode(data);
NewNode->Next = *First;
*First = NewNode;
}
// 尾部删除
void SListPopBack(SListNode **First)
{
assert(First);
assert(*First);
SListNode * Node = *First;
if (Node->Next == NULL)
{
free(Node);
*First = NULL;
return 0;
}
for (Node; Node->Next->Next != NULL; Node = Node->Next)
{}
free(Node->Next);
Node->Next = NULL;
}
// 头部删除
void SListPopFront(SListNode **First)
{
assert(First);
assert(*First);
SListNode *Node = *First;
*First = (*First)->Next;
free(Node);
}
// 给定结点插入,插入到结点前
void SListInsert(SListNode **First, SListNode *Pos, DataType data)
{
assert(First);
assert(Pos);
SListNode * NewNode = CreateNode(data);
SListNode * Node = *First;
if (*First == NULL)
{
*First = NewNode;
return ;
}
for (Node; Node->Next != Pos; Node = Node->Next)
{}
Node->Next = NewNode;
NewNode->Next = Pos;
}
// 给定结点删除
void SListErase(SListNode **First, SListNode *Pos)
{
assert(First);
assert(*First);
assert(Pos);
SListNode * Node = *First;
if (Pos == *First)
{
(*First)= Pos->Next;
free(Pos);
return ;
}
for (Node; Node->Next != Pos; Node = Node->Next)
{}
Node->Next = Pos->Next;
free(Pos);
}
// 按值删除,只删遇到的第一个
void SListRemove(SListNode **First, DataType data)
{
assert(First);
assert(*First);
SListNode * Node = *First;
SListNode * NNode = Node->Next;
if ((*First)->data == data)
{
*First = (*First)->Next;
free(Node);
return ;
}
for (Node; (NNode->data != data) && (Node != NULL); Node = Node->Next,NNode = Node->Next)
{}
if (NNode->data == data)
{
Node->Next = NNode->Next;
free(NNode);
}
else
printf("没找到\n");
}
// 按值删除,删除所有的
void SListRemoveAll(SListNode **First, DataType data)
{
assert(First);
assert(*First);
SListNode * cur = *First;
SListNode * per= NULL;
while (cur)
{
if (cur->data == data)
{
if (*First == cur)
{
*First = cur->Next;
free(cur);
cur = *First;
}
else
{
per->Next = cur->Next;
free(cur);
cur = per->Next;
}
}
else
{
per = cur;
cur = cur->Next;
}
}
}
// 销毁
void SListDestroy(SListNode **First)
{
assert(First);
SListNode * Node = *First;
SListNode * NNode = (*First)->Next;
if (NNode == NULL)
free(NNode);
for (Node; Node != NULL; Node = Node->Next, NNode = NNode->Next)
{
free(Node);
(*First)->Next = NNode;
}
}
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
SListNode * SListFind(SListNode *First, DataType data)
{
assert(First);
SListNode * Node = First;
for (Node; Node->data != data&&Node != NULL; Node = Node->Next)
{}
if (Node->data == data)
{
return Node;
}
else
return NULL;
}
//打印
void Pirntf(SListNode *First)
{
assert(First);
SListNode * Node;
for (Node = First; Node != NULL; Node = Node->Next)
{
printf("%d->", Node->data);
}
printf("\n");
}
void test()
{
SListNode *A;
SListInit(&A);
SListPushBack(&A, 3);
SListPushBack(&A, 3);
SListPushBack(&A, 4);
SListPushBack(&A, 3);
SListPushBack(&A, 4);
SListPushBack(&A, 3);
SListPushBack(&A, 5);
SListPushBack(&A, 4);
SListPushBack(&A, 6);
SListPushFront(&A, 2);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
SListPushFront(&A, 1);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
SListPushFront(&A, 3);
printf("初始状态为:");
Pirntf(A);
printf("尾删:");
SListPopBack(&A);
Pirntf(A);
printf("头删:");
SListPopFront(&A);
Pirntf(A);
printf("按位置插入第二个:");
SListInsert(&A, A->Next, 7);
Pirntf(A);
printf("按位置删除第三个:");
SListErase(&A, A->Next->Next);
Pirntf(A);
printf("按位置删除第 二个:");
SListErase(&A, A->Next);
Pirntf(A);
printf("按位置删除第一个:");
SListErase(&A, A);
Pirntf(A);
printf("删第一个4:");
SListRemove(&A, 4);
Pirntf(A);
printf("删所有的3:");
SListRemoveAll(&A, 3);
Pirntf(A);
printf("找到4:");
SListFind(A, 4);
SListDestroy(&A);
}
int main()
{
test();
}