本文主要是介绍数据结构---单链表(不带头结点)的相关操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
链表节点定义:
typedef struct SListNode
{int data ;struct SListNode* next ;
}SListNode ;
封装了一个指向链表节点指针的结构体,通过这个结构体变量进行单链表的调用。
typedef struct SList
{struct SListNode* first ;
}SList ;
代码如下:
//SList.h
#pragma oncetypedef int SLDataType ;typedef struct SListNode
{int data ;struct SListNode* next ;
}SListNode ;typedef struct SList
{struct SListNode* first ;
}SList ;//初始化&销毁
void SListInit(SList* list) ;//销毁
void SListDestroy(SList* list) ;//头插
void SListPushFront(SList* list, SLDataType data) ;//头删
void SListPopFront(SList* list) ;//打印
void SListPrint(SList* list) ;//尾插
void SListPushBack(SList* list, SLDataType data) ;//尾删
void SListPopBack(SList* list) ;//查找
SListNode* SListFind(SList* list, SLDataType data) ;//在pos位置的节点后插入元素
void SListInsertAfter(SListNode* pos, SLDataType data) ;//删除pos位置后的第一个节点
void SListEraseAfter(SListNode* pos) ;//删除遇到的指定的第一个节点
void SListRemove(SList* list, SLDataType data) ;
//**************************************************
//SList.c
#include "SList.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>//初始化
void SListInit(SList* list)
{assert(list != NULL) ;list->first = NULL ;
}//销毁
void SListDestroy(SList* list)
{SListNode* next ;SListNode* cur ;for(cur=list->first; cur!=NULL; cur=next){next = cur->next ;free(cur) ;}list->first = NULL ;
}//头插
void SListPushFront(SList* list, SLDataType data)
{SListNode* node = (SListNode*) malloc (sizeof(SListNode)) ;assert(node) ;node->data = data ;node->next = list->first ;//更新头指针的指向;list->first = node ;
}//头删
void SListPopFront(SList* list)
{SListNode* old_first = list->first ;assert(list) ; //有无链表assert(list->first != NULL) ; //有链表,链表里是否有元素,//若链表为空,则删除失败list->first = list->first->next ;free(old_first) ;
}//打印
void SListPrint(SList* list)
{SListNode* cur ;assert(list) ;for(cur=list->first; cur!=NULL; cur=cur->next){printf("%d-->", cur->data) ;}printf("NULL\n") ;
}//尾插
void SListPushBack(SList* list, SLDataType data)
{SListNode* node = (SListNode*) malloc (sizeof(SListNode)) ;SListNode* lastone = list->first ;assert(list != NULL) ;for( ; lastone->next != NULL; lastone=lastone->next){}assert(node != NULL) ;node->data = data ;node->next = lastone ->next ;lastone->next = node ;
}//尾删
void SListPopBack(SList* list)
{SListNode* cur ;SListNode* m ;assert(list != NULL) ;assert(list->first != NULL) ;if(list->first->next == NULL){//若链表为空,则尾删即为头删SListPopFront(list) ;return ;}for(cur=list->first; cur->next->next != NULL; cur=cur->next){}//找到倒数第二个节点m = cur->next ;cur->next = m->next ;free(m) ;
}//查找
SListNode* SListFind(SList* list, SLDataType data)
{SListNode* cur = list->first ;for( ; cur!=NULL; cur=cur->next){if(cur->data == data) {return cur ;}}return NULL ;
}//在pos位置的节点后插入元素
void SListInsertAfter(SListNode* pos, SLDataType data)
{SListNode* node = (SListNode*) malloc (sizeof(SListNode)) ;assert(node != NULL ) ;node->data = data ;node->next = pos->next ;pos->next = node ;
}//删除pos位置后的第一个节点
void SListEraseAfter(SListNode* pos)
{SListNode* node = pos->next->next ;free(pos->next) ;pos->next = node ;
}//删除遇到的指定的第一个节点
void SListRemove(SList* list, SLDataType data)
{SListNode* prev = NULL ;SListNode* cur = list->first ;while(cur != NULL && cur->data != data){prev = cur ;cur = cur->next ;}//要删除的节点不存在if(cur == NULL ){return ;}//要删除的节点若就是第一个节点if(prev == NULL){//即头删SListPopFront(list) ;return ;}prev->next = cur->next ;free(cur) ;
}
这篇关于数据结构---单链表(不带头结点)的相关操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!