本篇文章对单链表的基本操作做以简单的介绍,其中包含初始化、定义、头插(删)、尾插(删)等,若存在问题,请各位不吝赐教。
定义:
typedef int DataType;
typedef struct SListNode
{
DataType data;
struct SListNode *pNext;
}SListNode;
开辟新结点:
SListNode *NewSpace()
{
SListNode *pNew = (SListNode *)malloc(sizeof(SListNode));
assert(pNew);
pNew->pNext = NULL;
pNew->data = 0;
return pNew;
}
初始化:
void SListInit(SListNode **ppFirst)
{
assert(ppFirst);
(*ppFirst) = NULL;
return;
}
头插:
void PushFront(SListNode **ppFirst, DataType data)
{
assert(*ppFirst);
SListNode *pTmpNode = NewSpace();
pTmpNode->data = data;
pTmpNode->pNext = (*ppFirst);
(*ppFirst) = pTmpNode;
}
尾插:
void PushBack(SListNode **ppFirst, DataType data)
{
assert(ppFirst);
if ((*ppFirst) == NULL){
(*ppFirst) = NewSpace();
(*ppFirst)->pNext = NULL;
(*ppFirst)->data = data;
return;
}
SListNode *pTmpNode = (*ppFirst);
while (pTmpNode->pNext != NULL){
pTmpNode = pTmpNode->pNext;
}
pTmpNode->pNext = NewSpace();
pTmpNode->pNext->pNext = NULL;
pTmpNode->pNext->data = data;
}
头删:
void PopFront(SListNode **ppFirst)
{
if ((*ppFirst) == NULL){
printf("ERROR\n");
return;
}
SListNode *pTmpNode = (*ppFirst);
(*ppFirst) = (*ppFirst)->pNext;
free(pTmpNode);
pTmpNode = NULL;
}
尾删:
void PopBack(SListNode **ppFirst)
{
if ((*ppFirst) == NULL){
printf("ERROR\n");
return;
}
SListNode *pTmpNode = (*ppFirst);
while (pTmpNode->pNext->pNext != NULL){
pTmpNode = pTmpNode->pNext;
}
free(pTmpNode->pNext);
pTmpNode->pNext = NULL;
}
给定结点插入,插入到结点前:
void InsertFront(SListNode **ppFirst, SListNode *pPos, DataType data)
{
assert(*ppFirst);
assert(ppFirst);
SListNode *pTmpNode = (*ppFirst);
if ((*ppFirst) == pPos){
pTmpNode = NewSpace();
pTmpNode->data = data;
pTmpNode->pNext = (*ppFirst);
(*ppFirst) = pTmpNode;
return;
}
while (pTmpNode->pNext != pPos){
pTmpNode = pTmpNode->pNext;
}
SListNode *pNode = NewSpace();
pNode->data = data;
pNode->pNext = pTmpNode->pNext;
pTmpNode->pNext = pNode;
}
按给定结点值删除:
void DeData(SListNode **ppFirst, DataType data)
{
assert(*ppFirst);
SListNode *pTmpNode = (*ppFirst);
if (pTmpNode->data == data){ //判断是否为第一个结点的数据
(*ppFirst) = (*ppFirst)->pNext;
free(pTmpNode);
pTmpNode = NULL;
return;
}
while (pTmpNode->pNext != NULL){
if (pTmpNode->pNext->data == data){
SListNode *pNode = pTmpNode->pNext;
pTmpNode->pNext = pNode->pNext;
free(pNode);
pNode = NULL;
return;
}
pTmpNode = pTmpNode->pNext;
}
if (pTmpNode->data == data){ //上条语句退出后还剩最后一个结点没有判断
free(pTmpNode);
pTmpNode = NULL;
return;
}
printf("Not Found!\n");
按值删除所有的:
void DeDataAll(SListNode **ppFirst, DataType data)
{
assert(*ppFirst);
SListNode *pTmpNode = (*ppFirst);
if ((*ppFirst)->data == data){
pTmpNode = (*ppFirst);
(*ppFirst) = (*ppFirst)->pNext;
free(pTmpNode);
pTmpNode = NULL;
}
while (pTmpNode->pNext != NULL){
if (pTmpNode->pNext->data == data){
SListNode *pNode = pTmpNode->pNext;
pTmpNode->pNext = pNode->pNext;
free(pNode);
pNode = NULL;
continue;
}
pTmpNode = pTmpNode->pNext;
}
if (pTmpNode->data == data){
free(pTmpNode);
pTmpNode = NULL;
}
}
按地址删除:
void DePos(SListNode **ppFirst, SListNode *pPos)
{
assert(ppFirst);
assert(*ppFirst);
SListNode *pTmpNode = (*ppFirst);
if (pPos == (*ppFirst)){
(*ppFirst) = (*ppFirst)->pNext;
free(pTmpNode);
pTmpNode = NULL;
return;
}
}
按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL:
void FindPos(SListNode **ppFirst, DataType data)
{
assert(*ppFirst);
SListNode *pTmpNode = (*ppFirst);
while (pTmpNode != NULL){
if (pTmpNode->data == data){
printf("按值查找,返回地址 %p\n\n", pTmpNode);
return;
}
pTmpNode = pTmpNode->pNext;
}
printf("Not Found!\n");
}
销毁:
void Destory(SListNode **ppFirst)
{
assert(*ppFirst);
SListNode *pTmpNode = (*ppFirst);
while ((*ppFirst) != NULL){
(*ppFirst) = (*ppFirst)->pNext;
free(pTmpNode);
pTmpNode = (*ppFirst);
}
pTmpNode = NULL;
}
打印函数:
void Display(SListNode *ppFirst)
{
assert(ppFirst);
SListNode *pTmpNode = ppFirst;
while (pTmpNode->pNext != NULL){
printf("%d ", pTmpNode->data);
pTmpNode = pTmpNode->pNext;
}
printf("%d \n\n", pTmpNode->data);
}
主函数:
int main(void)
{
SListNode *SL;
SListInit(&SL);
PushBack(&SL, 11);
PushBack(&SL, 3);
PushBack(&SL, 3);
PushBack(&SL, 66);
PushBack(&SL, 77);
printf("尾插 ");
Display(SL);
PushFront(&SL, 4);
PushFront(&SL, 3);
PushFront(&SL, 2);
PushFront(&SL, 1);
printf("头插 ");
Display(SL);
PopFront(&SL);
printf("头删 ");
Display(SL);
PopBack(&SL);
printf("尾删 ");
Display(SL);
DeData(&SL, 4);
printf("按数据删 ");
Display(SL);
DeDataAll(&SL, 3);
printf("按数据删除所有遇到的 ");
Display(SL);
DePos(&SL, (SL->pNext));
printf("按地址删 ");
Display(SL);
InsertFront(&SL, SL->pNext, 99);
printf("按地址插入 ");
Display(SL);
FindPos(&SL, 2);
printf("销毁 \n\n");
system("pause");
return 0;
}