单链表之基础操作

头文件:

#ifndef  __LINKLIST_H__
#define   __LINKLIST_H__

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

typedef int DataType;
typedef struct ListNode
{
    struct ListNode* next;
    DataType data;
}Node,*pNode,List,*pList;

void InitLinklist(pList* ppList);//初始化
pList buyNode(DataType d);
void pushback(pList* ppList,DataType d);//尾插
void printLinklist(pList pList);//打印链表
void DestroyLinkList(pList* ppList); //销毁
void PopBack(pList* ppList); //尾删
void PushFront(pList* ppList, DataType d); //头插
void PopFront(pList* ppList); //头删
pNode Find(pList pList, DataType d);//查找 

函数实现:

#include"LinkList.h"

void InitLinklist(pList* ppList)//初始化链表
{
    assert(ppList!=NULL);
    *ppList=NULL;
}

pList buyNode(DataType d)
{    
    pNode p=(pNode)malloc(sizeof(Node));
    if(p==NULL)//开辟失败报错
    {  
        perror("BuyNode():malloc");  
    }   
    p->data=d;  //开辟成功
    p->next=NULL;  
    return p;  
}

void pushback(pList* ppList,DataType d)//尾插
{
    pList cul=*ppList;
    assert(ppList !=NULL);
    if(* ppList == NULL)
    {
        *ppList = buyNode(d);
    }
    else
    {
        while( (cul!=NULL) && ((cul->next) !=NULL ) )//找到最后一个节点
        {
            cul=cul->next;
        }
        cul->next=buyNode(d);
    }
}

void printLinklist(pList pList)//打印
{
    pNode p=pList;  
    if(p==NULL)//链表为空 
    {  
        printf("没有节点\n");  
        return;  
    }  
    while(p)  //循环打印
    {  
        printf("%d--",p->data);  
        p=p->next;  
    }  
    printf("over\n");  
}

void DestroyLinkList(pList* ppList)//销毁链表
{

    assert(ppList!=NULL);
    while(*ppList!=NULL)
    {
        pNode cul=*ppList;
        *ppList=(*ppList)->next;
        free(cul);
    }
    *ppList=NULL;
}


void PopBack(pList* ppList)//尾删
{
    assert(ppList!=NULL);
    if(*ppList==NULL)
    {
        return;
    }
    if((*ppList)->next==NULL)//只有一个节点
    {
        free(*ppList);
        *ppList=NULL;
        return;
    }
    else//不止一个
    {
        pNode cul =*ppList;
        while((cul->next)->next != NULL)
        {

            cul=cul->next;
        }
        free(cul->next);
        cul->next=NULL;
    }
}

void PushFront(pList* ppList, DataType d)//头插
{
    pNode cul=buyNode(d);
    assert(ppList!=NULL);
    if(*ppList==NULL)
    {
        *ppList=cul;
    }
    else
    {
        cul->next=*ppList;
        *ppList=cul;
    }
}

void PopFront(pList* ppList)//头删
{
    assert(ppList!=NULL);
    if(*ppList==NULL)
        return;
    if((*ppList)->next==NULL)//一个节点
    {
        free(*ppList);
        *ppList=NULL;
    }
    else
    {
        pNode cul=*ppList;
        *ppList=(*ppList)->next;
        free(cul);
        cul=NULL;
    }
}

pNode Find(pList pList, DataType d)//查找
{
    pNode cul=pList;
    if(pList==NULL)
        return NULL;
    while(cul->data !=d)
    {
        cul=cul->next;
    }
    if(cul != NULL)
    {
        printf("%d\n",cul->data);
        pList=cul;
        return pList;
    }
    return NULL;
}

猜你喜欢

转载自blog.csdn.net/S_Sandra/article/details/82319163