关于单链表的一些基本操作

原创 2015年11月19日 11:40:24

1.首先创建一个包含数据和指向该结构体的结构体即链表的节点

#pragma one
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
typedef struct ListNode
{
	DataType _data;
	struct ListNode* _next;
}ListNode;<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
2.链表的基本操作函数

//创造一个存储x的新节点
ListNode* BuyNode(DataType x)
{
	ListNode* newpHead = NULL;
	newpHead = (ListNode*)malloc(sizeof(ListNode));
	assert(newpHead);
	newpHead->_data = x;
	newpHead->_next = NULL;//避免newpHead->_next指向某个未知位置
	return newpHead;
}
//打印链表
void PrintListNode(ListNode* pHead)
{
	ListNode* tmp = pHead;
	while (tmp)
	{
		printf("%d->", tmp->_data);
		tmp = tmp->_next;
	}
	printf("NULL\n");
}
//摧毁链表
void DestroyList(ListNode* &pHead)
{
	ListNode* tmp = pHead;
	if (pHead == NULL)
	{
		printf("ListNode is empty\n");
		free(pHead);
		return;
	}
		while (pHead)
		{
			pHead = pHead->_next;
			free(tmp);
			tmp = pHead;
		}
		pHead = tmp;
		free(pHead);
}
//尾部插入一个节点
void PushBack(ListNode*& pHead, DataType x)
{
	if (pHead == NULL)
	{
		pHead = BuyNode(x);
	}
	else
	{
		ListNode *tail = pHead;
     	while (tail->_next != NULL)
		{
			tail = tail->_next;
		}
		tail->_next = BuyNode(x);
	}
}
//尾部删除一个节点
void PopBack(ListNode*& pHead)
{
	if (pHead == NULL)
	{
		printf("List is empty\n");
		return;
	}
	else if (pHead->_next == NULL)
	{
		free(pHead);
		pHead = NULL;
	}
	else
	{
		ListNode* prevTail = NULL, *tail = pHead;
		while (tail->_next != NULL)
		{
			prevTail = tail;
			tail = tail->_next;
		}
		prevTail->_next = NULL;
		free(tail);
	}
 }
//删除头部节点
void PopFront(ListNode* pHead)
{
	if (NULL == pHead->_next)
	{
		pHead = NULL;
	}
	else
		pHead = pHead->_next;
	return;
}
//寻找一个值为x的节点位置
ListNode* Find(ListNode* pHead, DataType x)
{
	ListNode* pos = pHead;
	while (pHead != NULL)
	{
		if (pHead->_data == x)
		{
			return pos;
		}
		else
		{
			pHead = pHead->_next;
			pos = pHead;
		}
	}
	return NULL;
}
//在链表中部的节点后插入新节点
void Insert(ListNode* pos, DataType x)
{
	assert(pos);
	ListNode* newNode = BuyNode(x);
	ListNode* tmp = pos->_next;
	newNode->_next = tmp;
	pos->_next = newNode;
	
}
//删除某个位置的节点
void Erase(ListNode*& pHead, ListNode* pos)
{
	ListNode* tmp = pHead;
	if (pHead == pos)
	{
		pHead = pHead->_next;
		return;
	}
	while (tmp)
	{
		if (tmp->_next == pos)
		{
			tmp->_next = tmp->_next->_next;
			free(pos);
			break;
		}
		tmp = tmp->_next;
	}
}
//删除链表中值为x的节点
void Remove(ListNode*& pHead, DataType x)
{
	ListNode* tmp = Find(pHead, x);
	Erase(pHead, tmp);
}
//逆置节点
ListNode* Reverse1(ListNode* pHead)
{
	ListNode* NewHead = NULL;
	ListNode* tmp = NULL;
	if (!pHead || !pHead->_next)
		return;
	while (pHead)
	{
		NewHead = pHead->_next;
		pHead->_next = tmp;
		tmp = pHead;
		pHead = NewHead;
	}
	return tmp;
}
//逆置节点
void Reverse(ListNode*& pHead)
{
	ListNode* Next = NULL;
	ListNode* Prev = NULL;
	if (!pHead || !pHead->_next)
       return;
	while (pHead)
	{
		Next = pHead->_next;
		pHead->_next = Prev;
		Prev = pHead;
		pHead = Next;
	}
	pHead = Prev;
}//删除无头单链表的非尾节点
void PopNoheadList(ListNode* pos)
{
	if (!pos&&!pos->_next)
		return;
	pos->_data = pos->_next->_data;
	pos->_next = pos->_next->_next;
}
//在无头单链表的一个非头节点插入一个节点
void PushNohead(ListNode* pos, DataType x)
{
	ListNode* NewNode = BuyNode(x);
	DataType tmp = 0;
	if (!pos)
		return;
	NewNode->_next = pos->_next;
	pos->_next = NewNode;
	tmp = NewNode->_data;
	NewNode->_data = pos->_data;
	pos->_data = tmp;
}
//查找单链表的中间节点,要求只能遍历一次
ListNode* FindMidNode(ListNode* pHead)
{
	ListNode* pos = NULL;
	ListNode* Fast = pHead, *Slow = pHead;
	while (Fast->_next!=NULL)
	{
		if (Fast->_next->_next != NULL)
		{
			Slow = Slow->_next;
			Fast = Fast->_next->_next;
		}
		else
			Fast = Fast->_next;
	}
	pos = Slow;
	return pos;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

链表基本操作及其过程详细叙述

链表概述:链表是一种常见的数据结构。数组可以存放数据,但是使用数组时要先指定数组中包含元素的个数,即数组长度。根据对链表的描述,可以想象到链表就像一个铁链,一环扣一环。然后通过头指针寻找链表中的元素,...
  • dezhihuang
  • dezhihuang
  • 2014年09月07日 10:15
  • 7608

单向链表的C语言实现与基本操作

本文的主要内容目录: 一、单向链表的C语言实现 二、单向链表的基本操作 一、单向链表的C语言实现 链表作为一种基本的数据结构在程序开发过程当中经常会使用到。对C语言来说链表的实现主要依靠结构体和指...
  • TECH_PRO
  • TECH_PRO
  • 2017年04月17日 05:59
  • 1872

c语言实现链表及其基本操作

链表:        链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。...
  • MBuger
  • MBuger
  • 2016年09月13日 18:18
  • 7436

单链表基本操作-面试必备

  • 2011年12月29日 13:00
  • 71KB
  • 下载

单链表的基本操作

  • 2016年12月09日 12:22
  • 27KB
  • 下载

单链表基本操作

  • 2014年08月25日 02:01
  • 3KB
  • 下载

单链表基本操作

  • 2015年08月06日 13:33
  • 2KB
  • 下载

带头结点单链表基本操作.doc

  • 2013年10月15日 16:34
  • 24KB
  • 下载

单链表的基本操作

  • 2015年04月10日 13:12
  • 2KB
  • 下载

单链表基本操作

  • 2012年04月15日 19:44
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于单链表的一些基本操作
举报原因:
原因补充:

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