c语言单链表的基本操作

本文介绍了链表作为动态存储方式的特点,包括其非连续的物理存储、动态内存分配和便于插入的优点。同时,文章讲解了链表操作的基础,如创建、删除、插入和输出,并强调了结构体在链表中的重要性,特别是在定义链表结点时的数据域和指针域。链表的三个关键属性——头指针、头结点和尾结点也被详细阐述,头指针不存储数据,头结点指向第二个结点,而尾结点通常指针域为空。

链表

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

结构体定义

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

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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值