1.sqlistnode.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct sListNode{
DataType data;
struct sListNode *pNext;
}sListNode;
void sListInit(sListNode **ppFirst);
sListNode *CreateNewNode(int data);
void pushBack(sListNode **ppFirst, DataType data);
void PushFront(sListNode **ppFirst, DataType data);
void Insert(sListNode **ppFirst, sListNode *ppos, DataType data);
void PopFront(sListNode **ppFirst);
void PopBack(sListNode **ppFirst);
// 根据结点地址删除,结点肯定在链表里
void PopAddress(sListNode **ppFirst, sListNode *pPos);
//查找,返回遇到的第一个
// 如果找到了,返回结点地址
// 否则返回 NULL
sListNode * findNode(sListNode *pFirst, DataType data);
// 根据数据去删除,删除遇到的第一个结点
void PopData(sListNode **ppFirst, DataType data);
// 根据数据去删除,删除遇到的所有结点
void PopAllData(sListNode **ppFirst, DataType data);
void sqlistNodeDestroy(sListNode **ppFirst);
2.sqlistnode.c
#include "sqlistnode.h"
//初始化
void sListInit(sListNode **ppFirst)
{
assert(ppFirst);
*ppFirst = NULL;//?
}
//增删改查
sListNode *CreateNewNode(int data)
{
sListNode *pNewNode = (sListNode*)malloc(sizeof(sListNode));
assert(pNewNode);
pNewNode->data = data;
pNewNode->pNext = NULL;
return pNewNode;
}
//尾插
void pushBack(sListNode **ppFirst, DataType data)
{
assert(ppFirst);
sListNode *pNewNode = CreateNewNode(data);
//如果链表是空链表,直接将新结点赋给pFirst
if (*ppFirst == NULL)
{
*ppFirst = pNewNode;
return;
}
sListNode *pNode;
pNode = *ppFirst;
//找尾结点
while (pNode->pNext != NULL){
pNode = pNode->pNext;
}
//只有pFirst一个结点
pNode->pNext = pNewNode;
}
//头插
void PushFront(sListNode **ppFirst, DataType data)
{
assert(ppFirst);
sListNode *pNewNode = CreateNewNode(data);
pNewNode->pNext = *ppFirst;
*ppFirst = pNewNode;
}
//插入到给定结点Ppos前,pPos肯定在链表里
void Insert(sListNode **ppFirst, sListNode *ppos, DataType data)
{
assert(ppFirst);
sListNode *pNode = *ppFirst;
//ppos是第一个结点
if (ppos == *ppFirst)
{
PushFront(ppFirst, data);
}
while (pNode->pNext != ppos)
{
pNode = pNode->pNext;
}
sListNode *pNewNode = CreateNewNode(data);
pNode->pNext = pNewNode;
pNewNode->pNext = ppos;
}
//头删
void PopFront(sListNode **ppFirst)
{
assert(ppFirst);
assert(*ppFirst);
sListNode *oldpFirst = *ppFirst;
*ppFirst = (*ppFirst)->pNext;
free(oldpFirst);
}
//尾删
void PopBack(sListNode **ppFirst)
{
assert(ppFirst);
assert(*ppFirst);
//如果只有一个结点
if ((*ppFirst)->pNext == NULL)
{
free(*ppFirst);
*ppFirst = NULL;
return;
}
//要删除最后一个结点,需找到倒数第二个结点
sListNode *pNode = *ppFirst;
while (pNode->pNext->pNext != NULL)
{
pNode = pNode->pNext;
}
free(pNode->pNext);
pNode->pNext = NULL;
}
//根据结点地址删除
void PopAddress(sListNode **ppFirst, sListNode *ppos)
{
assert(ppFirst);
assert(*ppFirst);
if (*ppFirst == ppos)
{
PopFront(ppFirst);
return;
}
sListNode *pNode = *ppFirst;
while (pNode->pNext != ppos)
{
pNode = pNode->pNext;
}
pNode->pNext = ppos->pNext;
free(ppos);
}
//查找,返回遇到的第一个
//找到返回结点地址
//找不到返回NULL
sListNode *findNode(sListNode *pFirst, DataType data)
{
sListNode *pNode = pFirst;
for (; pNode; pNode = pNode->pNext){
if (pNode->data == data)
{
return pNode;
}
}
return NULL;
}
//根据数据删除遇到的第一个结点地址
void PopData(sListNode **ppFirst, DataType data)
{
sListNode *pFound = findNode(*ppFirst, data);
PopAddress(ppFirst, pFound);
}
//根据数据删除,删除遇到的所有结点
void PopAllData(sListNode **ppFirst, DataType data)
{
sListNode *pNode = *ppFirst;
sListNode *pnext;
while (pNode->pNext)
{
if (pNode->pNext->data == data)
{
pnext = pNode->pNext;
pNode->pNext = pNode->pNext->pNext;
free(pnext);
}
else
{
pNode = pNode->pNext;
}
}
//当结点为首结点时
if ((*ppFirst)->data == data)
{
PopFront(ppFirst);
}
}
//销毁
void sqlistNodeDestroy(sListNode **ppFirst)
{
assert(ppFirst);
sListNode *pNode, *pNext;
pNode = *ppFirst;
while (pNode)
{
pNext = pNode->pNext;
free(pNode);
pNode = pNext;
}
*ppFirst = NULL;
}
void print(sListNode *pFirst)
{
sListNode *pNode;
pNode = pFirst;
for (; pNode; pNode = pNode->pNext)
{
printf("%d-> ", pNode->data);
}
printf("NULL\n");
}
3.main.c
#include "sqlistnode.h"
int main()
{
sListNode *pFirst;
sListInit(&pFirst);
assert(pFirst==NULL);
pushBack(&pFirst, 3);
assert(pFirst);
print(pFirst);
pushBack(&pFirst, 7);
print(pFirst);
PushFront(&pFirst,8);
print(pFirst);
pushBack(&pFirst, 7);
print(pFirst);
//sListNode *pFound = findNode(pFirst, 3);
/*if (pFound == NULL)
{
printf("没有找到!");
}
else
{
printf("%d\n", pFound->data);
Insert(&pFirst, pFound, 7);
print(pFirst);
PopAddress(&pFirst, pFound);
print(pFirst);
}*/
// PopData(&pFirst, 7);
PopAllData(&pFirst, 7);
print(pFirst);
sqlistNodeDestroy(&pFirst);
//Insert(&pFirst, pFirst, 9);
//print(pFirst);
// PopBack(&pFirst);
//print(pFirst);
//popFront(&pFirst);
// findNode(pFirst, 3);
print(pFirst);
system("pause");
return 0;
}
646

被折叠的 条评论
为什么被折叠?



