slist.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct SlistNode
{
struct SlistNode *_next;
DataType _data;
}SlistNode;
SlistNode* BuySlistNode(DataType data); //创建节点
void PrintSlist(SlistNode *pHead); //打印链表
void InitSlist(SlistNode **ppHead); //初始化链表
SlistNode* FindNode(SlistNode **ppHead, DataType data); //寻找节点
void PushBackSlist(SlistNode **ppHead, DataType data); //尾插
void PushFrontSlist(SlistNode **ppHead); //尾删
void PopBackSlist(SlistNode **ppHead, DataType data); //头插
void PopFrontSlist(SlistNode **ppHead); //头删
void PrevInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data); //任意位置插入,插在前
void TailInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data); //任意位置插入,插在后
void ErasePosSlist(SlistNode **ppHead, SlistNode *pos); //任意位置删除
void DestroySlist(SlistNode **ppHead); //销毁链表
int CountSlist(SlistNode *pHead); //计算链表的节点个数
slist.c
#include"slist.h"
SlistNode* BuySlistNode(DataType data) //创建节点
{
SlistNode *head = (SlistNode*)malloc(sizeof(SlistNode)*sizeof(DataType));
if (head)
{
head->_data = data;
head->_next = NULL;
return head;
}
return NULL;
}
void InitSlist(SlistNode **ppHead) //初始化链表
{
SlistNode *cur;
assert(ppHead);
cur = *ppHead;
while (cur)
{
cur->_data = 0;
cur = cur->_next;
}
}
void PrintSlist(SlistNode *pHead) //打印链表
{
while (pHead) //空链表也打印了
{
printf("%d--> ", pHead->_data);
pHead = pHead->_next;
}
printf("NULL\n");
}
SlistNode* FindNode(SlistNode **ppHead, DataType data) //寻找节点
{
SlistNode *find = NULL;
assert(ppHead);
find = *ppHead;
while (find)
{
if (find->_data == data)
return find;
find = find->_next;
}
return NULL;
}
void PushBackSlist(SlistNode **ppHead, DataType data) //尾插
{
SlistNode *tail = NULL;
assert(ppHead);
if (*ppHead == NULL) //没有节点
{
*ppHead = BuySlistNode(data);
}
else
{
tail = *ppHead;
while (tail->_next)//一个或多个节点
{
tail = tail->_next;
}
tail->_next = BuySlistNode(data);
}
}
void PushFrontSlist(SlistNode **ppHead) //尾删
{
SlistNode *del = NULL;
SlistNode *prev = NULL;
assert(ppHead);
if (NULL == *ppHead)
return;
del = *ppHead;
del = del->_next;
while (del->_next)
{
prev = del;
del = del->_next;
}
prev->_next = del->_next; //prev->_next = NULL
free(del);
}
void PopBackSlist(SlistNode **ppHead, DataType data) //头插
{
SlistNode *newnode = NULL;
assert(ppHead);
if (NULL == *ppHead)
*ppHead = BuySlistNode(data);
else
{
newnode = BuySlistNode(data);
newnode->_next = *ppHead;
*ppHead = newnode;
}
}
void PopFrontSlist(SlistNode **ppHead) //头删
{
assert(ppHead);
if (NULL == *ppHead)
printf("链表为空\n");
else
*ppHead = (*ppHead)->_next;
}
void PrevInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data) //任意位置插入,插在前面
{
SlistNode *cur = NULL;
assert(ppHead);
assert(pos);
if (pos == *ppHead) //在头部
{
cur = BuySlistNode(data);
cur->_next = pos;
*ppHead = cur;
}
else
{
cur = pos;
pos = BuySlistNode(pos->_data); //替换法插入
pos->_next = cur->_next;
cur->_next = pos;
cur->_data = data;
}
}
void TailInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data) //插到后面
{
SlistNode *newnode = NULL;
assert(pos);
assert(ppHead);
if (NULL == *ppHead)
{
printf("链表为空\n");
}
else
{
newnode = BuySlistNode(data);
newnode->_next = pos->_next;
pos->_next = newnode;
}
}
void ErasePosSlist(SlistNode **ppHead, SlistNode *pos) //任意位置删除, 删pos后的下一个节点
{
SlistNode *cur = NULL;
assert(ppHead);
if (*ppHead == NULL)
printf("链表为空\n");
else
{
if (pos == *ppHead)
{
*ppHead = pos->_next;
free(pos);
}
else
{
cur = *ppHead;
while (cur && (cur->_next != pos))
{
cur = cur->_next;
}
if(NULL == cur) //防止当前链表中没有pos这个节点
{
printf("当前链表没有pos这个节点\n");
}
else
{
cur->_next = pos->_next;
free(pos);
}
}
}
}
void DestroySlist(SlistNode **ppHead) //销毁链表,前后指针法
{
SlistNode *del = NULL;
assert(ppHead);
del = *ppHead;
while (*ppHead)
{
*ppHead = (*ppHead)->_next;
free(del);
del = *ppHead;
}
free(*ppHead);
}
int CountSlist(SlistNode *pHead) //计算链表的节点个数
{
//assert(pHead);
int count = 0;
while (pHead)
{
++count;
pHead = pHead->_next;
}
return count;
}
test.c
#include"slist.h"
//测初始化,尾插,尾删
//test1()
//{
// SlistNode *list = NULL;
// InitSlist(&list);
// PrintSlist(list);
//
// PrintSlist(list);
// PushBackSlist(&list, 1);
// PushBackSlist(&list, 2);
// PushBackSlist(&list, 3);
// PushBackSlist(&list, 4);
// PushBackSlist(&list, 5);
// PushBackSlist(&list, 6);
// /*PrintSlist(list);
// InitSlist(&list);
// PrintSlist(list);*/
//
// PushFrontSlist(&list);
// PushFrontSlist(&list);
// PrintSlist(list);
//}
//测试头插,头删
//test2()
//{
// SlistNode *list = NULL;
// PopBackSlist(&list, 1);
// //PopBackSlist(&list, 2);
// //PopBackSlist(&list, 3);
// //PopBackSlist(&list, 4);
// //PopBackSlist(&list, 5);
// //PopBackSlist(&list, 6);
// //PopBackSlist(&list, 7);
// PrintSlist(list);
//
// PopFrontSlist(&list);
// PopFrontSlist(&list);
// //PopFrontSlist(&list);
// //PopFrontSlist(&list);
// PrintSlist(list);
//}
//测试任意位置删除和插入,销毁,计算个数
test3()
{
SlistNode *list = NULL;
SlistNode *pos = NULL;
PushBackSlist(&list, 1);
PushBackSlist(&list, 2);
PushBackSlist(&list, 3);
PushBackSlist(&list, 4);
PushBackSlist(&list, 5);
PushBackSlist(&list, 6);
PrintSlist(list);
printf("%d\n",CountSlist(list));
/*pos = FindNode(&list, 1);*/
//PrevInsertPosSlist(&list, pos, 8);
//PrintSlist(list);
//TailInsertPosSlist(&list, pos,7);
//PrintSlist(list);
//ErasePosSlist(&list, pos);
//PrintSlist(list);
//ErasePosSlist(&list, pos);
PushFrontSlist(&list);
PopFrontSlist(&list);
printf("%d\n", CountSlist(list));
PrintSlist(list);
DestroySlist(&list);
PrintSlist(list);
printf("%d\n", CountSlist(list));
}
int main()
{
//test1();
//test2();
test3();
system("pause");
return 0;
}