无头单向非循环链表增删查改实现

it2022-05-05  115

无头单向非循环链表:

结构简单,一般不会单独用来存数据。

实际中更多的是作为其他数据结构的子结构,如哈希表、图的领接等等。

下面,我们来看看无头单向非循环链表增删查改实现。

SList.h(函数声明)

#ifndef _SLIST_H_ #define _SLIST_H_ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> // 无头单向非循环链表增删查改实现 typedef int SLTDataType; typedef struct SListNode{ SLTDataType data; struct SListNode*next; }SListNode; typedef struct SList{ SListNode* head; }SList; void SListInit(SList* plist); void SListDestory(SList* plist); SListNode* BuySListNode(SLTDataType x); void SListPushFront(SList* plist, SLTDataType x); void SListPopFront(SList* plist); SListNode* SListFind(SList* plist, SLTDataType x); // 在pos的后面进行插入 void SListInsertAfter(SList* pos, SLTDataType x); void SListEraseAfter(SList* pos); void SListRemove(SList* plist, SLTDataType x); void SListPrint(SList* plist); #endif/*_SLIST_H_*/

SList.c(函数实现)

#include"SList.h" #include<stdio.h> SListNode* BuySListNode(SLTDataType x)//创建结点 { SListNode* res = res = (SListNode*)malloc(sizeof(SListNode)); if (res == NULL) { printf("创建结点失败"); return NULL; } res->data = x; res->next = NULL; return res; } void SListInit(SList* plist) { plist->head=NULL; } void SListPushFront(SList* plist, SLTDataType x)//头插 { SListNode* tmp = BuySListNode(x); if (tmp != NULL) { tmp->next = plist->head; plist->head = tmp; } } void SListPopFront(SList* plist)//头删 { if (NULL != plist->head) { SListNode* pt = plist->head; plist->head = pt->next; free(pt); } } void SListInsertAfter(SListNode* pos, SLTDataType x) { SListNode* tmp = BuySListNode(x); tmp->next = pos->next; pos->next = tmp; } void SListEraseAfter(SListNode* pos)//删除pos+1位置结点 { SListNode* tmp = pos->next; pos->next = pos->next->next; free(tmp); } SListNode* SListFind(SList* plist, SLTDataType x)//查询指定值 { SListNode* tmp=plist->head; while (tmp!= NULL) { if (tmp->data == x) return tmp; else tmp = tmp->next; } return NULL; } void SListRemove(SList* plist, SLTDataType x)//删除值为x的结点 { while (plist->head != NULL&&plist->head->data == x) { SListPopFront(plist); } if (plist->head == NULL) { return; } SListNode* ph = plist->head; SListNode* pt = ph->next; while (NULL != pt) { if (pt->data == x) { pt = pt->next; SListEraseAfter(ph); ph->next = pt; continue; } pt = pt->next; ph = ph->next; } } void SListPrint(SList* plist) { SListNode* pt = plist->head; while (NULL != pt) { printf("%d->", pt->data); pt = pt->next; } printf("\n"); } void SListDestory(SList* plist) { if (plist->head != NULL) { SListNode*pt = plist->head; while (pt!=NULL) { SListNode* t=pt; pt = pt->next; free(t); } plist->head = NULL; } }

main.c(测试函数)

#include"SList.h" int main() { SList test; SListInit(&test); SListPushFront(&test, 1); SListPushFront(&test, 2); SListPushFront(&test, 3); SListNode* tmp = test.head->next->next; SListInsertAfter(tmp, 4); SListInsertAfter(tmp, 4); SListInsertAfter(tmp, 5); SListInsertAfter(tmp, 6); //打印 SListPrint(&test); SListRemove(&test, 6); SListPrint(&test); //摧毁 SListDestory(&test); system("pause"); return 0; }

 


最新回复(0)