SList.h
#include
typedef int SListDataType;
//s=single 单链表节点的定义
typedef struct SListNode
{
SListDataType data; //数据域
struct SListNode* next; //指针域
}SListNode;
SListNode* SListCreateNode(SListDataType n);
void SListPushBack(SListNode** pphead, SListDataType n);
void SListPopBack(SListNode** pphead);
void SListPushFront(SListNode** pphead, SListDataType n);
void SListPopFront(SListNode** pphead);
void SListPrint(SListNode* phead);
SListNode* SListSearch(SListNode* phead,SListDataType n);
void SListInsertAfter(SListNode* pos, SListDataType n);
void SListEraseAfter(SListNode* pos);
.
.
.
SList.c
#include"SList.h"
//打印及遍历
void SListPrint(SListNode* phead)
{
//此时phead不需要断言
SListNode* cur = phead;
while (cur!=NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
//创建加初始化!!!
SListNode* SListCreateNode(SListDataType n)
{
SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));
if (NewNode == NULL)
{
printf("扩容失败!");
exit(-1);
}
NewNode->data = n;
NewNode->next = NULL;
return NewNode;
}
void SListPushBack(SListNode** pphead, SListDataType n)
{
if (*pphead == NULL)
{
*pphead=SListCreateNode(n);
}
else
{
//找到尾巴
SListNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
//建立新结点
tail->next = SListCreateNode(n);
}
}
void SListPopBack(SListNode** pphead)
{
//1.phead直接指向空
//2.一个节点
//3.两个及两个以上
if (*pphead == NULL)
{
return;
}
else if ((*pphead)->next == NULL)
{
free(*pphead);//free的是该指针指向的空间
*pphead = NULL;
}
else
{
SListNode* tail = *pphead;
SListNode* prev = NULL;
while (tail->next!=NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);//tail可以不指向NULL,因为它的生命周期只在这个这个花括号里
prev->next = NULL;
}
}
void SListPushFront(SListNode** pphead, SListDataType n)
{
//1.new一个结点
//2.->next=*pphead
//3.*pphead=new的结点
SListNode* NewNode = SListCreateNode(n);
NewNode->next = *pphead;
*pphead = NewNode;
}
void SListPopFront(SListNode** pphead)
{
//1.没有节点
//2.一个结点+两个及以上的结点
if (*pphead == NULL)
{
return;
}
else
{
SListNode* next = (* pphead)->next;
free(*pphead);
*pphead = next;
}
}
SListNode* SListSearch(SListNode* phead,SListDataType n)
{
SListNode* cur = phead;
while (cur->next != NULL)
{
if (cur->data == n)
return cur;
cur = cur->next;
}
}
void SListInsertAfter(SListNode* pos, SListDataType n)
{
assert(pos);
SListNode* newNode = SListCreateNode(n);
newNode->next = pos->next;
pos->next = newNode;
}
void SListEraseAfter(SListNode* pos)
{
//1.没有结点+一个结点
//2.两个及两个以上
assert(pos);
if (pos == NULL || pos->next==NULL)
{
return;
}
else
{
SListNode * next = pos->next;
SListNode* nextnext = pos->next->next;
pos->next = nextnext;
free(next);
pos = NULL;
}
}
.
.
.
test.c
#include"SList.h"
void TestSList()
{
//SListNode phead;//直接定义一个头节点?
//此时只需要一个指针即可,不需要结点!!!!
SListNode* pList = NULL;//因为头指针只有指针域没有数据域,这里只需要一个指针变量即可
SListPrint(pList);
SListPushBack(&pList, 1);
SListPushBack(&pList, 1);
SListPushBack(&pList, 1);
SListPushBack(&pList, 1);
SListPrint(pList);
SListPopBack(&pList);
SListPopBack(&pList);
SListPopBack(&pList);
SListPopBack(&pList);
SListPopBack(&pList);
SListPrint(pList);
SListPushFront(&pList, 1);
SListPushFront(&pList, 2);
SListPushFront(&pList, 3);
SListPushFront(&pList, 4);
SListPushFront(&pList, 5);
//头插打印过来的值是颠倒过来的
SListPrint(pList);
SListPopFront(&pList);
SListPopFront(&pList);
SListPopFront(&pList);
SListPopFront(&pList);
SListPopFront(&pList);
SListPrint(pList);
SListPopFront(&pList);
SListPushFront(&pList, 1);
SListPushFront(&pList, 2);
SListPushFront(&pList, 3);
SListPushFront(&pList, 4);
SListPrint(pList);
SListNode* pos=SListSearch(pList, 2);
if (pos!= NULL)
{
pos->data = 666;
}
SListPrint(pList);
}
void TestSList2()
{
SListNode* pList=NULL;
SListPushBack(&pList, 1);
SListPushBack(&pList, 2);
SListPushBack(&pList, 3);
SListPushBack(&pList, 4);
SListPrint(pList);
SListNode* pos=SListSearch(pList,1);
SListInsertAfter(pos, 666);
SListPrint(pList);
pos= SListSearch(pList, 2);
SListEraseAfter(pos);
SListPrint(pList);
}
int main()
{
TestSList2();
return 0;
}