【c】c语言中有头单向链表详解、单链表初始化,删除整个链表、遍历整个链表、头插、头删、查找、尾插、尾删。

//main.c
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include "slist.h"
/*
for(cur=head;cur;cur=cur->next)

{
cur;
}
for(cur=head->next;cur!=head;cur=cur->next)

{
cur;
}
for(cur=head;cur;cur=cur->next)

{
cur;
}
*/
void listtest()
{
	SList test;
	SListInit(&test);
	SListPushFront(&test, 10);
	SListPushFront(&test, 1);
	SListPushFront(&test, 2);
	SListPushFront(&test, 3);
	SListPushFront(&test, 6);
	SListNode* cur = SListFind(&test, 2);
	SListInsertAfter(cur, 20);
	SListEraseAfter(cur);
	SListPrint(&test);
}
int main()
{
	listtest();
	system("pause");
	return 0;
}

 

//slist.c
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
#include "slist.h"
void SListInit(SList* plist)
{
	plist->_head = NULL;

}//链表初始化,头结点赋成空;
void SListDestory(SList* plist)
{
	SListNode *tmp;//链表节点
	while (plist->_head)
	{
		tmp = plist->_head;//不断任命新头,释放旧头
		plist->_head = plist->_head->_next;
		free(tmp);
	}
}
void SListPushFront(SList* plist, SLTDataType x)
{
	//链表头压,得到指向链表头结点的指针;
	SListNode *cur = (SListNode *)malloc(sizeof(SListNode));//给链表结点(结构体)开辟空间
	cur->_data = x;//赋值
	cur->_next = plist->_head;//将这个结点的指针指向NULL
	plist->_head = cur;//将结点此时的地址复制个头指针,让它记住
	//所以先进入的会后移,和进栈一样,先进后出
}
void SListPopFront(SList* plist)
{
	//头删
	SListNode *tmp;
	if (plist->_head)
	{

		tmp = plist->_head;
		plist->_head = plist->_head->_next;//每个链表的第一个是它的头,头可以是很多的指针
		//next指向的是头结点之后的结点,将这个结点的cur赋值给头指针,即改变了头指针的指向,
		free(tmp);//释放掉第一个cur
	}
}
SListNode* SListFind(SList* plist, SLTDataType x)
{
	SListNode* cur;//基于堆内存的操作,用的时候自己开辟,因为他们都是指针
	//这个块是个结构体,初始化这个结构体之后,它有一个int型变量和一个指针,指针可以指向下一个
	//块,而初始化这个块的时候定义的是指针指向,指针就是他的位置,所以它有三个是手柄,结构体
	//变量指针,int,_next指针,
	for (cur = plist->_head; cur; cur = cur->_next)
//链表遍历
	{
		if (cur->_data==x)
		{
			return cur;
		}
	}
}
void SListInsertAfter(SListNode* pos, SLTDataType x)
{
	//尾插
	assert(pos);
	SListNode* cur = (SListNode*)malloc(sizeof(SListNode));
	cur->_data = x;
	cur->_next = pos->_next;
	pos->_next = cur;//一个链表结点有三个元素,分别是数据,他自己类型的指针,和他自身的指针
}
void SListEraseAfter(SListNode* pos)
{
	assert(pos);
	SListNode* tmp = pos->_next;
	pos->_next = tmp->_next;
	free(tmp);
}

void SListPrint(SList* plist)
{
	assert(plist);

	SListNode* cur;
	for (cur=plist->_head;cur;cur=cur->_next)
	{
		printf("%d->", cur->_data);
	}
	printf("NULL\n");
}
//slist.h
#ifndef _SLIST_H
#define _SLIST_H
typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType _data;
	struct SListNode* _next;
}SListNode;//链表节点,这是链表当中的单个块,包含了一个要存储的变量,和一个指针,当给_data
//赋值的时候需要动态开辟个内存,因此链表使用的是堆空间
typedef struct SList
{
	SListNode* _head;
}SList;//链表,用它来初始化 SList test;plist=&test;用来记录头结点;
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(SListNode* pos, SLTDataType x);
// 在pos的前面进行插入
void SListEraseAfter(SListNode* pos);
//void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);
//void TestSList();
#endif _SLIST_H

单链表的初始化 

 

 

单链表的头删 

 

单链表的尾插 

 

单链表的尾删 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值