单链表的基本操作

原创 2018年04月16日 20:24:00

SList.h
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef int DataType;
typedef struct ListNode
{
	struct ListNode* pNext;//指向链表中下一个结点
	 DataType data;//当前结点所保存的元素
}Node,*PNode;

//生成一个新结点
PNode BuySListNode(DataType data);

//打印链表
void PrintSList(PNode PHead);

// 链表的初始化 
void SListInit(PNode* pHead); 

// 尾插 
void SListPushBack(PNode* pHead, DataType data); 

// 尾删 
void SListPopBack(PNode* pHead); 

// 头插 
void SListPushFront(PNode* pHead, DataType data); 

// 头删 
void SListPopFront(PNode* pHead); 

// 在链表中查找值为data的元素,找到后返回值为data的结点 
PNode SListFind(PNode pHead, DataType data); 

// 在pos位置插入值为data的结点 
void SListInsert(PNode* pHead, PNode pos, DataType data); 

// 删除pos位置额结点 
void SListErase(PNode* pHead, PNode pos); 

// 获取链表中值data的结点 
int SListSize(PNode pHead,DataType data); 

// 判断链表是否为空 
int SListEmpty(PNode pHead); 

// 销毁聊表 
void SListDestroy(PNode* pHead); 

///////////////////////////////
void testInitAndPushBack();
void testPopBackAndPushFront();
void testFindAndInsert();
void testEraseAndSize();

SList.c
#include "SList.h"

void PrintSList(PNode pHead)
{
	PNode pCur=pHead;
	if(pHead==NULL)
	{
		printf("链表为空\n");
		return ;
	}
	while(pCur)
	{
		printf("%d->",pCur->data);
		pCur=pCur->pNext ;
	}
	printf("NULL\n");
}

void SListInit(PNode* pHead)
{
	assert(pHead);
	*pHead=NULL;
}

PNode BuySListNode(DataType data)
{
	PNode pNewNode=(PNode)malloc(sizeof(Node));	
	if(pNewNode==NULL)
	{
		assert(0);
		return NULL;
	}

	pNewNode->data =data;
	pNewNode->pNext =NULL;

	return pNewNode;
}

void SListPushBack(PNode* pHead, DataType data)
{
	PNode pCur=*pHead;

	assert(pHead);
	//链表为空
	if(*pHead==NULL)
	{
		*pHead=BuySListNode(data);
	}
	//链表中有结点
	else 
	{
		while(pCur->pNext)
		{
			pCur=pCur->pNext;
		}
		pCur->pNext =BuySListNode(data);
	}
}

void SListPopBack(PNode* pHead)
{
	PNode pCur=*pHead;
	PNode pre=NULL;
	assert(pHead);//检验链表是否存在
	//链表为空
	if(pHead==NULL)
	{
		return;
	}
	//链表中只有一个结点
	else if((*pHead)->pNext==NULL)
	{
		free(*pHead);
		*pHead=NULL;
	}
	//链表中含有多个结点
	else
	{
		while(pCur->pNext)
		{
			pre=pCur;
			pCur=pCur->pNext;
		}
		free(pCur);
		pre->pNext =NULL;
	}
}


void SListPushFront(PNode* pHead, DataType data)
{
	PNode pNewNode=BuySListNode(data);
	assert(pHead);

	pNewNode->pNext =(*pHead);
	*pHead=pNewNode;
}

void SListPopFront(PNode* pHead)
{
	PNode pDelNode=*pHead;
	assert(pHead);
	if(*pHead==NULL)
	{
		printf("链表为空\n");
		return;
	}
	else
	{
		*pHead=(*pHead)->pNext ;
		free(pDelNode);
		pDelNode=NULL;
	}
}

PNode SListFind(PNode pHead, DataType data)
{
	if(pHead==NULL)
	{
		printf("链表为空\n");
		return NULL;
	}
	while(pHead)
	{
		if(pHead->data ==data)
		{
			return pHead;
		}
		pHead=pHead->pNext ;
	}
	return NULL;
}

void SListInsert(PNode* pHead, PNode pos, DataType data)
{
	PNode pNewNode=NULL;
	assert(pHead);
	if(*pHead==NULL || pos==NULL)
	{
		SListPushBack(pHead,data);
	}
	else
	{
		PNode pCur=NULL;
		PNode pNewNode=NULL;
		int tmp;

		pNewNode =BuySListNode(data);
		pNewNode->pNext =pos->pNext ;
		pos->pNext =pNewNode;

		tmp=pos->data ;
		pos->data =pNewNode->data ;
		pNewNode->data=tmp;
	}
}

void SListErase(PNode* pHead, PNode pos)
{
	PNode del=NULL;
	PNode pre=NULL;
	assert(pHead);
	if(*pHead==NULL || pos==NULL)
	{
		return;
	}

	del=*pHead;
	while(del && del!=pos)
	{
		pre=del;
		del=del->pNext ;
	}
	if(del->pNext !=NULL)
	{
		pre->pNext=del->pNext ;
		free(del);
		del=NULL;
	}
	else
	{
		free(del);
		pre->pNext =NULL;
	}
}

int SListSize(PNode pHead,DataType data)
{
	int count=0;
	if(pHead==NULL)
	{
		printf("链表为空\n");
		return 0;
	}
	while(pHead)
	{
		if(pHead->data ==data)
		{
			count++;
		}
		pHead=pHead->pNext  ;
	}
	return count;
}

int SListEmpty(PNode pHead)
{
	if(pHead==NULL)
	{
		return 0;
	}
	else
	{
		return 1;//不为空
	}
}

void SListDestroy(PNode* pHead)
{
	PNode cur;
	PNode next;
	assert(pHead);
	if(*pHead==NULL)
	{
		return;
	}
	cur=*pHead;
	while(cur)
	{
		next=cur->pNext ;
		free(cur);
		cur=next;
	}
	*pHead=NULL;
}
/////////////////////////////////////////
//测试
void testPushBackAndPopBack()
{
	PNode pHead;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,2);
	SListPushBack(&pHead,3);
	PrintSList(pHead);
	SListPopBack(&pHead);
	PrintSList(pHead);
	SListDestroy(&pHead);
}

void testPushFrontAndPopFront()
{	
	PNode pHead;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,2);
	SListPushBack(&pHead,3);
	PrintSList(pHead);
	SListPushFront(&pHead,5);
	PrintSList(pHead);	
	SListPopFront(&pHead);
	PrintSList(pHead);	
	SListDestroy(&pHead);
}

void testFindAndInsert()
{
	PNode pHead,pCur;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,3);
	SListPushBack(&pHead,5);
	SListPushBack(&pHead,7);
	PrintSList(pHead);
	pCur=SListFind(pHead,7);
	SListInsert(&pHead,pCur,9);
	PrintSList(pHead);
	SListDestroy(&pHead);
}

void testEraseAndSize()
{
	int ret=0;
	PNode pHead;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,3);
	SListPushBack(&pHead,5);
	SListPushBack(&pHead,3);
	SListPushBack(&pHead,4);
	SListPushBack(&pHead,9);
	SListPushBack(&pHead,3);

	PrintSList(pHead);
	/*pCur=SListFind(pHead,3);
	SListErase(&pHead,pCur);
	PrintSList(pHead);*/
	ret=SListSize(pHead,3);
	printf("count=%d\n",ret);
	SListDestroy(&pHead);
}

test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"

int main() 
{
	//testPushBackAndPopBack();
	//testPushFrontAndPopFront();
	//testFindAndInsert();
	testEraseAndSize();
	return 0; 
}

VB中获取逻辑磁盘的信息

我们在编程的时候有时会需要得到系统中逻辑磁盘的一些信息,如磁盘卷标、磁盘序列号、空间大小、剩余空间等,这些信息直接使用VB提供的函数显然是无法得到的。但是,借助于VB对WINDOWS API函数的支持...
  • jadedrip
  • jadedrip
  • 2000-11-08 22:20:00
  • 1082

单链表基本操作java实现

单链表基本操作 - java实现 1.单链表学习了好久,今天终于有时间写一下了,带头结点的单链表上的基本操作,Java实现。 (1) 先来个接口 public interface IList { ...
  • ping1632743560
  • ping1632743560
  • 2016-09-26 20:04:42
  • 399

c++学习笔记—单链表基本操作的实现

用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表)、结点的查找、删除、排序、打印输出、逆置、链表销毁等基本操作。 IDE:vs2013 具体实现代码如下: #includ...
  • xujian_2014
  • xujian_2014
  • 2015-01-14 21:13:09
  • 1399

单链表的基本操作c语言实现

#include #define false 0 #define ok 1//定义节点的结构 typedef struct node{ int data; struct node *n...
  • gongdileidechouzhu
  • gongdileidechouzhu
  • 2017-02-25 16:14:53
  • 1842

c++ 单链表基本操作

#include #include #include #include #include /*c++实现简单的单链表操作*/ using namespace std; typedef str...
  • cfan0801
  • cfan0801
  • 2012-03-13 21:01:44
  • 25068

第一篇博客—c语言单链表的基本操作

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • sakurakider
  • sakurakider
  • 2017-05-21 19:42:38
  • 673

单链表的基本操作-----图形解析

首先我们需要思考的是为什么需要单链表呢? 单链表和顺序表相比较,又有什么优点呢? 在顺序表中,当我们需要头插,或者在顺序表的中间位置插入元素时,就必须将后面的元素一一后移,再将需要插入的元...
  • qq_34992845
  • qq_34992845
  • 2016-12-31 01:12:28
  • 4512

数据结构—单链表的基本操作(源代码)

#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; typedef int Elemtype; typedef s...
  • weixin_40908734
  • weixin_40908734
  • 2018-01-29 11:43:00
  • 76

单链表基本操作详解

#  单链表基本操作 文中提到的内容的链接一并列在这里: 顺序表:http://blog.csdn.net/bitboss/article/details/51559175 冒泡排序:...
  • bitboss
  • bitboss
  • 2016-06-04 22:12:46
  • 3196

单链表的基本操作大全之C语言实现(一)

单链表的基本操作大全之C语言实现1. 单链表的定义链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单元可以是连续的也可以是不连续的。为了建立起数据元素之间的关系,对于每个数据元素除了存放...
  • men_wen
  • men_wen
  • 2016-10-20 21:43:10
  • 10947
收藏助手
不良信息举报
您举报文章:单链表的基本操作
举报原因:
原因补充:

(最多只允许输入30个字)