链表中的数据只添加了一个int型成员
链表的头文件声明
SList.h
#ifndef __SLIST_H_
#define __SLIST_H_
#include <stdio.h>
#include <stdlib.h>
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;
}SListNode;
void SListInit(SListNode** phead);
void SListDestory(SListNode** phead);
SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SListNode** phead, SLTDataType x);
void SListPopFront(SListNode** phead);
SListNode* SListFind(SListNode** phead, SLTDataType x);
// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x);
// 在pos的前面进行插入
void SListEraseAfter(SListNode* pos);
void SListRemove(SListNode** phead, SLTDataType x);
void SListRemoveAll(SListNode** phead, SLTDataType x);
void SListPrint(SListNode* plist);
void SListReverse(SListNode** phead);
void SListReverse2(SListNode** phead);
void TestSList();
#endif
头文件实现
SList.c
#include "SList.h"
void SListInit(SListNode** phead){
*phead = (SListNode*)malloc(sizeof(SListNode));
*phead = NULL;
}
SListNode* BuySListNode(SLTDataType x){
SListNode* temp = (SListNode*)malloc(sizeof(SListNode));
temp->data = x;
temp->next = NULL;
return temp;
}
void SListPushFront(SListNode** phead, SLTDataType x){
SListNode* temp = BuySListNode(x);
temp->next = *phead;
*phead = temp;
}
void SListPrint(SListNode* plist){
SListNode* temp = plist;
for (; temp; temp = temp->next){
printf("%d->", temp->data);
}
printf("NULL\n");
}
void SListPopFront(SListNode** phead){
SListNode* temp = (*phead)->next;
free(*phead);
*phead = temp;
}
SListNode* SListFind(SListNode** phead, SLTDataType x){
SListNode* temp = *phead;
for (; temp; temp = temp->next){
if (temp->data == x){
return temp;
}
}
return NULL;
}
void SListInsertAfter(SListNode* pos, SLTDataType x){
SListNode* temp = BuySListNode(x);
//temp->data = x;
temp->next = pos->next;
pos->next = temp;
}
void SListEraseAfter(SListNode* pos){
SListNode* temp = pos ->next;
if (temp->next == NULL){
return;
}
pos->next = temp->next;
free(temp);
}
void SListRemove(SListNode** phead, SLTDataType x){
if ((*phead)->data == x){
SListPopFront(phead);
}
SListNode* temp = *phead;
for (; temp->next; temp = temp->next){
if (temp->next->data == x){
SListEraseAfter(temp);
return;
}
}
}
void SListRemoveAll(SListNode** phead, SLTDataType x){
SListNode* temp = *phead;
if (*phead == NULL){
return;
}
if ((*phead)->data == x){
SListPopFront(phead);
}
for (; temp->next; ){
if (temp->next->data == x){
SListEraseAfter(temp);
}
else{
temp = temp->next;
}
}
return;
}