单链表是一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素。单链表的结点由数据元素以及下一个数据元素存放的地址构成。
现将单链表的实现整理如:
//单链表的实现
typedef int DataType;
typedef struct SListNode
{
struct SListNode* _next;
DataType _data;
}SListNode;
SListNode* BuySListNode(DataType x);//申请一个新的结点
void SListPrint(SListNode* pHead);//打印
void SListDestory(SListNode** ppHead);//销毁
void SListPushBack(SListNode** ppHead, DataType x);//尾插
void SListPopBack(SListNode** ppHead);//尾删
void SListPushFront(SListNode** ppHead, DataType x);//头插
SListNode* SListFind(SListNode* pHead, DataType x);//查找
void SListInsest(SListNode** ppHead, SListNode* pos, DataType x);//插入到指定位置之前
void SListErase(SListNode** ppHead, SListNode* pos);//删除指定位置
SListNode *BuySListNode(DataType x){
SListNode *newnode = (SListNode *)malloc(sizeof(SListNode));
newnode->_data = x;
newnode->_next = NULL;
return newnode;
}
void SListPrint(SListNode *pHead){
if(pHead == NULL){
printf("NULL\n");
}
SListNode *cur = pHead;
while(cur != NULL){
printf("%d -- ", cur->_data);
cur = cur->_next;
}
printf("\n");
}
void SListDestory(SListNode **ppHead){
assert(ppHead);
SListNode *cur = *ppHead;
while(cur != NULL){
SListNode *del = cur;
cur = cur->_next;
free(del);
del = NULL;
}
*ppHead = NULL;
}
void SListPushBack(SListNode** ppHead, DataType x){
assert(ppHead);
SListNode *newnode = BuySListNode(x);
SListNode *cur = *ppHead;
if(cur == NULL){
*ppHead = newnode;
return ;
}
while(cur->_next != NULL){
cur = cur->_next;
}
cur->_next = newnode;
}
void SListPopBack(SListNode** ppHead){
assert(ppHead);
assert(*ppHead);
SListNode *cur = *ppHead;
//只有一个结点
if(cur->_next == NULL){
free(*ppHead);
*ppHead = NULL;
return ;
}
while(cur->_next->_next != NULL){
cur = cur->_next;
}
SListNode *del = cur->_next;
cur->_next = NULL;
free(del);
}
void SListPushFront(SListNode** ppHead, DataType x){
assert(ppHead);
SListNode *newnode = BuySListNode(x);
newnode->_next = *ppHead;
*ppHead = newnode;
}
SListNode* SListFind(SListNode* pHead, DataType x){
assert(pHead);
SListNode *cur = pHead;
while(cur != NULL){
if(cur->_data == x){
return cur;
}
cur = cur->_next;
}
return NULL;
}
void SListInsest(SListNode** ppHead, SListNode* pos, DataType x){
assert(ppHead);
if(pos == *ppHead){
SListPushFront(ppHead, x);
return ;
}
SListNode *cur = *ppHead;
while(cur->_next != pos){
cur = cur->_next;
}
SListNode *newnode = BuySListNode(x);
newnode->_next = cur->_next;
cur->_next = newnode;
}
void SListErase(SListNode** ppHead, SListNode* pos){
assert(ppHead);
SListNode *cur = *ppHead;
if(pos == cur){
cur = cur->_next;
free(*ppHead);
*ppHead = cur;
return ;
}
while(cur->_next != pos){
cur = cur->_next;
}
SListNode *del = cur->_next;
cur->_next = cur->_next->_next;
free(del);
}