单向链表 c语言数据结构

无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。

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

头文件SLIst.h

#pragma once
#include<stdio.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); 
void SListPopBack(SList *list);
void SListPushBack(SList *list, SLTDataType x);
SListNode* SListFind(SList* plist, SLTDataType x); 
// 在pos的后面进行插入 
void SListInsertAfter(SListNode* pos, SLTDataType x); 
// 在pos的后面进行删除 
void SListEraseAfter(SListNode* pos); 
void SListRemove(SList* plist, SLTDataType x);

void SListPrint(SList* plist); 

实现函数SList.c


#include "SList.h"
#include<assert.h>
#include<stdlib.h>
void SListInit(SList* plist)
{
	assert(plist);
	plist->head = NULL;
}
void SListDestory(SList* plist)
{
	assert(plist);
	
	SListNode* cur = plist->head;
	SListNode* next;

	while (cur){
		next = cur->next;
		free(cur);
		cur = next;
	}
	plist->head = NULL;
}
SListNode* BuySListNode(SLTDataType x)
{
	SListNode* node = (SListNode*)malloc(sizeof(SListNode));

	assert(node);

	node->data = x;
	node->next = NULL;

	return node;
}
//int SListDestory(SList* plist);

//头插
void SListPushFront(SList* plist, SLTDataType x)
{
	assert(plist);

	SListNode* node = BuySListNode(x);
	node->next = plist->head;
	plist->head = node;
}
//头删
void SListPopFront(SList* plist)
{
	assert(plist);

	SListNode* node = plist->head;
	plist->head = plist->head->next;
	free(node);
}
//查找
SListNode* SListFind(SList* plist, SLTDataType x)
{
	SListNode* node = plist->head;

	while (node){
		if (node->data == x)
			return node;
		node = node->next;
	}

	return NULL;
}
//在pos后插入
void SListInsertAfter(SListNode* pos, SLTDataType x)
{
	assert(pos);

	SListNode* node = BuySListNode(x);

	node->next = pos->next;
	pos->next = node;

}
//在pos后删除
void SListEraseAfter(SListNode* pos)
{
	assert(pos);

	SListNode* old_pos = pos->next;
	pos->next = pos->next->next;

	free(old_pos);
}
//尾删
void SListPopBack(SList *list)
{
	assert(list);

	SListNode* node = list->head;

	if (node == NULL)
		return;
	if (node->next == NULL){
		list->head = NULL;
		return;
	}

	while (node->next->next){
		node = node->next;
	}
	
	free(node->next);
	node->next = NULL;

}
//尾插
void SListPushBack(SList *list, SLTDataType x)
{
	assert(list);

	SListNode* node = BuySListNode(x);
	SListNode* cur = list->head;
	
	if (cur == NULL){
		SListPushFront(list, x);
		return;
	}
	
	while (cur->next){
		cur = cur->next;
	}
		cur->next = node;

}
void SListRemove(SList* plist, SLTDataType x)
{
	assert(plist);

	SListNode* node = plist->head;
	SListNode* cur = NULL;

	while (node){
		if (node->data == x){
			if (node == plist->head){
				plist->head = node->next;
			}
			else{
				cur->next = node->next;
			}
		}
		else{
			cur = node;
		}
		node = node->next;
	}
}

//打印
void SListPrint(SList* plist)
{
	assert(plist);

	SListNode* node = plist->head;
	while (node){
		printf("%d-->", node->data);
		node = node->next;
	}
	printf("NULL\n");
}

测试 main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"
#include<windows.h>
void test(){
	SList slist;
	
	SListInit(&slist);
	SListPushFront(&slist, 4);
	SListPushFront(&slist, 4);
	SListPushFront(&slist, 2);
	SListPushFront(&slist, 4);
	SListPushFront(&slist, 5);
	SListPushFront(&slist, 4);
	SListPushFront(&slist, 7);
	SListPushFront(&slist, 4);
	SListPrint(&slist);

	SListRemove(&slist, 4);

	SListPrint(&slist);


	SListPopFront(&slist);
	SListPopFront(&slist);
	SListPrint(&slist);

    SListNode* node = SListFind(&slist, 2);

	SListInsertAfter(node, 4);
	SListPrint(&slist);


	SListPopBack(&slist);
	SListPopBack(&slist);
	SListPrint(&slist);


	SListPushBack(&slist, 5);
	SListPushBack(&slist, 6);
	SListPushBack(&slist, 7);
	SListPushBack(&slist, 8);

	SListPrint(&slist);


	SListDestory(&slist);
	SListPrint(&slist);
}
int main()
{
	test();
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值