单链表

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值