您的位置:首页 > 编程语言 > C语言/C++

c语言单链表的基本操作

2017-10-28 11:39 459 查看

链表

是一种动态存储方式,和顺序表相比,链表物理存储上是非连续的,而且采用动态内存开辟,其优点是方便插入,没有上限的存储,不需要内存空间的重组,能有效的分配和利用内存资源,不会造成空间浪费,缺点是排序很麻烦,查找也很麻烦,而且需要多个指针操作,容易出错。

链表的各类操作包括:链表的创建、删除、插入、输出、排序等。

结构体定义

要想学懂链表,必须先学好并灵活运用结构,在链表中,一个个独立的结点就是一个结构体元素,一个结点包括两部分(数据域和指针域),靠指针将他们链接在一起。

typedf struct Node
{
DataType _date;
struct Node *_next;
//存放下一个节点的地址
}Node,*pNode;


链表

创建链表三个重要属性:头指针、头结点、尾结点。

头指针(pHead):指向链表头部的指针,也可以看作是 一个特殊的结点,有指针域和数据域,虽然有数据域但不储存任何数据,也没有任何作用,指针域指向第一个结点数据域;

头结点(pNode):链表的第一个结构体元素,其指针域存放第2个节点的地址;

尾结点(TailNode):链表最后一个结构体元素,数据域存放数据域,指针域一般指向空(NULL)。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<stdio.h>
#include<Windows.h>
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node * _pNext;
}*pNode;
//初始化链表
void InitList(pNode* pHead)
{
assert(pHead);
*pHead = NULL;
}
//创建一个新链表节点
pNode BuyNode(DataType data)
{
pNode pNewNode = (pNode)malloc(sizeof(struct Node));
if(NULL == pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data = data;
pNewNode->_pNext = NULL;
return pNewNode;
}
//尾插
void PushBack(pNode* pHead,DataType _data)
{
assert(pHead);
if(NULL == *pHead)
{
*pHead = BuyNode(_data);
}
else    {
pNode pTailNode = *pHead;
while(pTailNode->_pNext)
{
pTailNode = pTailNode->_pNext;
}
pTailNode->_pNext = BuyNode(_data);
}
}
//尾删
void PopBack(pNode* pHead) {
if(NULL == *pHead)
return;
else if(NULL == (*pHead)->_pNext)
{
free(*pHead);
*pHead = NULL;
}
else
{
pNode pTailNode = *pHead;
pNode pPre = NULL;
while(pTailNode->_pNext)
{
pPre = pTailNode;
pTailNode = pTailNode->_pNext;

}
pPre->_pNext = NULL;
free(pTailNode);
}
}
//打印链表
void PrintList(pNode pHead)
{
pNode pCur = pHead;
while(pCur)
{
printf("%d--->",pCur->_data);
pCur = pCur->_pNext;
}
printf("NULL\n");
} //头插
void PoshFront(pNode* pHead,DataType data)
{
pNode pNewNode;
assert(pHead);

pNewNode = BuyNode(data);
if(NULL == pNewNode)
return;
pNewNode->_pNext = *pHead;
*pHead = pNewNode;
}
//头删
void PopFront(pNode* pHead)
{
pNode pCur = *pHead;
assert(pHead);
if(NULL == pCur)
return;
else
{
*pHead = (*pHead)->_pNext;
free(pCur);
}
}
// 返回结点在链表中的位置
pNode FindList(pNode pHead,DataType data)
{
pNode pCur = pHead;
while(pCur)
{       if(pCur->_data == data)
return pCur;
else
pCur = pCur->_pNext;
}
return NULL;
}
// 任意位置插入值为data的结点
pNode Insert(pNode pos,DataType data)
{
pNode pNewNode;
if(NULL == pos)
return NULL;
pNewNode = BuyNode(data);
if(NULL == pNewNode)
//return NULL;

pNewNode->_pNext = pos->_pNext;
pos->_pNext = pNewNode;
}
// 删除pos位置上的结点
void Erase(pNode* pHead,pNode pos)
{
assert(pHead);
if(NULL == *pHead || NULL == pos)
return;

if(*pHead == pos)
PopFront(pHead);
else
{       pNode pCur = *pHead;
while(pCur)
{

if(pCur->_pNext == pos)

break;

pCur = pCur->_pNext;

}
pCur->_pNext = pos->_pNext;
free(pos);
}

}
// 销毁单链表
void DestoryList(pNode* pHead)
{

//正向销毁
pNode pCur = *pHead;
pNode pNext = NULL;
while(pCur)
{
pNext = pCur->_pNext;
free(pCur);
pCur = pNext;
}   *pHead = NULL; }
// 求链表中节点的个数
int SizeList(pNode pHead)
{   int count = 1;  pNode pCur = pHead;
while(pCur)
{
count++;
pCur = pCur->_pNext;
}
return count;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: