0
点赞
收藏
分享

微信扫一扫

关于数据结构中链表的一些接口函数的学习和思考

Greatiga 2022-09-30 阅读 50


这篇博客主要总结了链表的头删尾删头插尾插等接口函数,在VS2010上可以运行的起来

slist.h文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
//一个一个按需向堆上申请内存
typedef int SListDateType;
//链式结构体的名称重定义为SListNode,这个SListNode表示一个结构体
//这个项目中使用到的这个结构体的一个全局变量是SLTNode。
typedef struct SListNode
{
SListDateType data;
struct SListNode* next;
}SLTNode;

void SListPrint(SLTNode*phead);//phea表示指向第一个结点的头指针
void PushBack(SLTNode**phead,SListDateType x);//尾插
void PushFront(SLTNode**phead,SListDateType x);//头插
void PopBack(SLTNode**phead);
void PopFront(SLTNode**phead);

slist.c文件

#include"Slist.h"
#include<stdlib.h>
//链式结构体的名称重定义为SListNode,这个SListNode表示一个结构体
//这个项目中使用到的这个结构体的一个全局变量是SLTNode。
void SListPrint(SLTNode*phead)
{

SLTNode* cur=phead;//用一个表示地址的指针去指向他
while(cur!=NULL)
{
printf("%d ",cur->data);//cur是一个指向地址的变量,,称为指针变量
cur=cur->next;

}
printf("\n");
}

void PushBack(SLTNode**phead,SListDateType x)//尾插
{
//如果链表为空,没有尾结点的话,建一个newnode
SLTNode* newnode;

newnode=(SLTNode*)malloc(sizeof(SLTNode));//这三行的意思是创立一个新的结点,这三行可以专门做成一个函数
newnode->data=x;
newnode->next=NULL;

//如果链表为空,没有尾结点的话,建一个newnode
if(*phead==NULL)
{
*phead=newnode;
}
else
{
//找到尾节点
SLTNode*tail=*phead;
while(tail->next!=NULL)
{
tail=tail->next;
}
tail->next=newnode;
}

}


void PushFront(SLTNode**phead,SListDateType x)//头插
{
SLTNode* newnode;

newnode=(SLTNode*)malloc(sizeof(SLTNode));//创立新结点
newnode->data=x;
newnode->next=NULL;

newnode->next=*phead;
*phead=newnode;
}

void PopBack(SLTNode**phead)//尾删
{
SLTNode*tail;
SLTNode*prev;
tail=*phead;
prev=NULL;
if(*phead==NULL)
{
return;
}

while(tail->next!=NULL)
{
prev=tail;
tail=tail->next;
}
free(tail);
tail=NULL;
prev->next=NULL;

}

void PopFront(SLTNode**phead)//头删
{

if(!(*phead))
{
return ;
}


else{
SLTNode*next=(*phead)->next;
free(*phead);
*phead=next;
}
//else
//{
// tail=*phead;//plist
// tail=tail->next;
// *phead=tail;
// free(tail);
//}
}



SLTNode*SListFind(SLTNode*phead,SListDateType x)//查找
{
SLTNode*cur=phead;


while(cur)//遍历
{
if(cur->data==x)
{
return cur;
}
else
{
cur=cur->next;
}
}
return NULL;
}


void SListInsert(SLTNode**phead,SLTNode*pose,SListDateType x)//插入
{


}
void SListErase(SLTNode**phead,SLTNode*pose);//删除
void SListDestory(SLTNode**phead);//摧毁



test.c函数

#include<stdio.h>
#include"Slist.h"

//形参的改变不影响实参
void testslist1()
{
SLTNode*plist=NULL;//不需要初始化 直接给个空就可以 //形参的改变不影响实参
PushBack(&plist,1);
PushBack(&plist,2);
PushBack(&plist,3);
PushBack(&plist,4);

SListPrint(plist);

PushFront(&plist,1);
PushFront(&plist,2);
PushFront(&plist,3);
PushFront(&plist,4);
SListPrint(plist);

PopBack(&plist);
PopBack(&plist);
PopBack(&plist);
SListPrint(plist);

PopFront(&plist);

SListPrint(plist);
}


int main()
{

testslist1();

return 0;
}

举报

相关推荐

0 条评论