单链表的代码

slist.h

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

typedef  int SLTDataType;

typedef struct SListNode{
   SLTDataType data;
   struct SListNode* next;

}SLTNode;

void SLPrint(SLTNode * phead);


//尾部插入
void SLTPushBack(SLTNode ** pphead, SLTDataType X);
//头插入
void SLTPushFront(SLTNode ** pphead, SLTDataType X);

//尾部删除
void SLTpopBack(SLTNode ** pphead, SLTDataType X);
//头部删除
void SLTpopFront(SLTNode ** pphead, SLTDataType X);


//查找
SLTNode *SLFind(SLTNode * phead,SLTDataType x);

//在指定位置前插入数据
void SLTInsert(SLTNode * pphead,SLTNode *pos,SLTDataType x);

//在指定位置后插入数据
void SLTInsertafter(SLTNode *pos,SLTDataType x);

//删除节点pos
void SLTErase(SLTNode **pphead,SLTNode *pos);
//删除pos之后的节点
void SLTEraseafter(SLTNode *pos);
//销毁链表
void SListDestory(SLTNode **pphead);

slist.c

#include"slist.h"

void SLPrint(SLTNode * phead){

    SLTNode * pcur =phead;//不为空
    while(pcur){
        printf("%d ",pcur->data);
        pcur=pcur->next;
    }
}

SLTNode* SLTBuynode(SLTDataType x)
{
SLTNode * newnode =(SLTNode*)malloc(sizeof(SLTNode));
if(newnode==NULL){
    perror("malloc fail");
    exit(1);
}

newnode->data =x;
newnode->next =NULL;
return newnode;

}

//尾部插入
void SLTPushBack(SLTNode **pphead, SLTDataType X){
    //指向第一个节点指针
    SLTNode* newnode =SLTBuynode(x);
    //空链表和非空链表
    if(*phead==NULL){
    *phead=newnode;
    }
    else{
    //找尾
    SLTNode *ptail =*phead;
    while(ptail->next){
     ptail=ptail->next;
    }
    //ptail就是尾节点
    ptail->next=newnode;
    }
}

//头插入
void SLTPushFront(SLTNode **pphead, SLTDataType X){
    assert(pphead);
    SLTNode* newnode= SLTBuynode(x);
   
    newnode->next=*pphead;
    *pphead = newnode;



}

//尾部删除
void SLTpopBack(SLTNode ** pphead, SLTDataType X){
    //链表不为空
     assert(pphead && *pphead);
     //链表只有一个节点
    if((*pphead)->next==NULL){
        free(*pphead);
        *pphead=NULL;
    }
    else{
    
    //链表有多个节点
      SLTNode *prev =*pphead;
     SLTNode *ptail =*pphead;
     while(ptail->next){
        prev=ptail;
        prev->next=NULL;
     }

     free(ptail);
     ptail=NULL;
     prev->next=NULL;
    }
}

//头部删除
void SLTpopFront(SLTNode ** pphead, SLTDataType X){
assert(pphead&&*pphead);

SLTNode *next=(*pphead)->next;
free(*pphead);
*pphead=next;
}
//查找

SLTNode *SLFind(SLTNode * phead,SLTDataType x){
   SLTNode *pcur =phead;
   while(pcur){
    if(pcur->data==x){
        return pcur;

    }
    pcur=pcur->next;
}
return NULL;
//phead==null

}

//在指定位置前插入数据
void SLTInsert(SLTNode * pphead,SLTNode *pos,SLTDataType x){
assert(pphead&&*pphead);
assert(pos);
SLTNode *newnode=SLTBuynode(x);
//pos==*pphead;只有头节点
if(pos==*pphead){
SLTPushFront(pphead,x);
}
else{
SLTNode *prev=*pphead;
  while(prev->next!=pos){
    prev=prev->next;
 }
newnode->next=pos;
prev->next=newnode;

}
}

//在指定位置后插入数据
void SLTInsertafter(SLTNode *pos,SLTDataType x){
    assert(pos);
    SLTNode *newnode=SLTBuynode(x);
    newnode->next=pos->next;
    pos->next=newnode;
}

//删除节点pos
void SLTErase(SLTNode **pphead,SLTNode *pos){
    assert(pphead&&*pphead);
    assert(pos);
if(pos==*phead){
    //头删
SLTpopFront(pphead);
}
    else{
    SLTNode *prev=*phead;
    while(prev->next!=pos){
        prev=prev->next;
    }
    prev->next=pos->next;
    free(pos);
    pos=NULL;
    }
};

//删除pos之后的节点
void SLTEraseafter(SLTNode *pos){

    assert(pos&&pos->next);
    SLTNode *del=pos->next;
    pos->next=del->next;
    free(del);
    del=NULL;

}

//销毁链表
void SListDestory(SLTNode **pphead){

    assert(pphead && *pphead);
    SLTNode *pcur=*pphead;
    while(pcur){
     SLTNode *next=pcur->next;
     free(pcur);
     pcur=next;

    }
    *pphead=NULL;
}

test.c


#include"slist.h"
void SLtest(){

    //链表节点
SLTNode* node1 =(SLTNode *)malloc(sizeof(SLTNode));
node1->data=1;

SLTNode* node2 =(SLTNode *)malloc(sizeof(SLTNode));
node2->data=2;

SLTNode* node3=(SLTNode *)malloc(sizeof(SLTNode));
node3->data=3;

SLTNode* node4 =(SLTNode *)malloc(sizeof(SLTNode));
node4->data=4;
 

//将四个节点连接起来
node1->next=node2;
node2->next=node3;
node3->next=node4;
node4->next=NULL;

SLTNode* plist =node1;
SLPrint(plist);

}

test01(){

    SLTNode *plist=NULL;
    SLTPushBack(&plist,2);
    SLPrint(plist) ;

    SLTNode *find=SLFind(plist,3);
    SLTInsert(&plist,find,11);
    SLPrint(plist);
    SListDestory(&plist);
}

int main(){

return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值