单向链表无头链表

程序检测

插入 ,头插,头删,尾删,寻找,检测链表,尾插,删除,移除相同

在这里插入图片描述

头文件

#pragma once

#define  OK 1
#define  FALSE 0
//带有头结点的单方向链表

typedef int SlDataType;


//定义了节点

typedef struct SlistNode {

	SlDataType data;
	struct SlistNode * Next;

}SlistNode;

typedef struct Slist {

	SlistNode* head;

}Slist;

//初始化销毁
void Slistinit(Slist *plist);
void SlistDestory(Slist *plist);
//尾插,头插,头删,尾删
void SlistPushback(Slist *plist,SlDataType data);
void SlistPushFront(Slist *plist,SlDataType data);
void SlistpopFront(Slist *plist);
void Slistpopback (Slist *plist);
SlistNode* SlistFind(Slist *plist,SlDataType data);

//在 pos 位置之后插入
void SlistInsertAfter(SlistNode* pos,SlDataType data);
//删除节点
void SlistRemove(Slist* plist, SlistNode* pos); 

//计算节点
size_t SListNode_Size (Slist *plist);

//检测是否为空
int SListEmpty(Slist* plist); 
//清除节点
void SListClear(Slist *plist); 
//删除所有标志节点
void SlistRemoveAll(Slist *plist,SlDataType data);



程序代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "Slist.h"
#include <stdlib.h>
#include <assert.h>

//初始化
void Slistinit(Slist *plist){

	plist->head = NULL;

}

//销毁
//把每一个节点都置为空包括头结点
void SlistDestory(Slist *plist){
	SlistNode *Node = plist->head;
	while(Node) {
		SlistNode *temp = Node->Next;
		free(Node);
		Node = temp;
	}
}

//添加节点
SlistNode * BuySlistNode(SlDataType data){
	SlistNode* Node = (SlistNode*)malloc (sizeof(SlistNode));
	if(Node == NULL) {
		assert(0);
	}
	Node->data = data;
	Node->Next = NULL;
	return Node;
}

//尾插
void SlistPushback(Slist *plist,SlDataType data){
	SlistNode *Node;
	if(plist->head == NULL) {
		plist->head = BuySlistNode (data);
		return;
	}
	else {
		Node = plist->head;
		while(Node->Next != NULL) {
			Node = Node->Next;
		}
		Node->Next = BuySlistNode (data);
	}	
}

//头插
void SlistPushFront(Slist *plist,SlDataType data) {
	SlistNode *Node;
	Node = (SlistNode*)malloc (sizeof(SlistNode));

	Node->data = plist->head->data;
	plist->head->data = data;
	Node->Next = plist->head->Next;
	plist->head->Next = Node;

}
//头删
void SlistpopFront(Slist *plist){
	 SlistNode *Node = plist->head->Next;

	 if(plist->head == NULL) {
		 return ;
	 }

	 plist->head->data = Node->data;
	 plist->head->Next =Node->Next;

	 free(Node);
}

//尾删
void Slistpopback (Slist *plist){
	SlistNode *Node = plist->head;
	SlistNode *temp = NULL;
	//空
	if(plist->head == NULL) {
		return ;
	}
	//个的时候
	else if(plist->head->Next == NULL) {
		free(plist->head);
		plist->head = NULL;
	}
	else {
		while(Node->Next != NULL){ 
			temp = Node;
			Node = Node->Next;
		}
		temp->Next = NULL;
		free(Node);
	}
}

//查找
SlistNode* SlistFind(Slist *plist,SlDataType data){
	SlistNode *Node = plist->head;
	while(Node) {
		if(Node->data == data) {
			return Node;
			break;
		}
		else { 
			Node = Node->Next;
		}
	}
	return NULL;
}

//任意位置的插入
void SlistInsertAfter(SlistNode* pos,SlDataType data){
	SlistNode *Node = (SlistNode*)malloc (sizeof(SlistNode));
	if(pos->Next == NULL){
		Node->data = data;
		pos->Next = Node;
		Node->Next = NULL;
	}
	else {
		Node->data = data;
		Node->Next  = pos->Next;
		pos->Next = Node;
	}
}
int SListEmpty(Slist* plist){
	SlistNode *Node = plist->head;
	if(Node) {
		return OK;
	}
	else return FALSE; 
}
//清空链表
//清空的话是保留第一个节点
//不包括头结点
void SListClear(Slist *plist) {
	SlistNode *Node = plist->head;
	SlistNode *temp;
	while(Node->Next) {
		temp = Node->Next;
		free(Node);
		Node = temp;
	}
	/*plist->head->data = NULL;*/
	plist->head->Next = NULL;

}

//有效的个数
size_t SListNode_Size (Slist *plist){
	size_t size = 0;
	SlistNode *Node = plist->head;
	while(Node) {
		size++;
		Node = Node->Next;
	}
	return size;
}

void Printlist(Slist *plist) {
	SlistNode *Node = plist->head;
	while(Node != NULL ) {
		printf("%d-->",Node->data);
		Node = Node->Next;
	}
	printf ("NULL\n");
} 

//任意位置的删除
void SlistRemove(Slist* plist, SlistNode* pos) {
	SlistNode *Node = plist->head;
	if(plist->head == NULL){
		printf("节点为空!\n");
		return ;
	}
	else {
		while(Node) {
			if(Node->Next == pos) {
				Node->Next = pos->Next;
				free(pos);
				return ;
			}
			else{
				Node = Node->Next;
			}
		}
	}  
}

void SlistRemoveAll(Slist *plist,SlDataType data){
	SlistNode *Node = plist->head;
	SlistNode *temp = NULL;
	if(Node  == NULL) {
		return ;
	}
	//首先头删
	if(plist->head->data == data) {
		SlistpopFront(plist);
		return ;
	}
	//不是头删之后就看下一个是不是要删除的
	//定义两个变量
	//一个是当前节点
	//另外一个就是下一个要删除的节点
	while(Node->Next!=NULL) {
		if(Node->Next->data == data) {
			temp = Node->Next;
			Node->Next = temp->Next;
			free(temp);
		}
		else {
			Node = Node->Next;
		}
	}
}
void TestList(){
	SlistNode* pos;
	Slist s;

	//尾插
	Slistinit(&s);
	SlistPushback (&s,1);
	SlistPushback (&s,2);
	SlistPushback (&s,3);
	SlistPushback (&s,4);
	SlistPushback (&s,5);
	Printlist(&s);

	////销毁链表
	//SlistDestory(&s);
	//Printlist(&s);

	//头插
	SlistPushFront(&s,6);
	Printlist(&s);

	//头删
	SlistpopFront(&s);
	Printlist(&s);

	//尾删
	Slistpopback(&s);
	Printlist(&s);

	//查找
	printf("找到了! %p\n",SlistFind(&s,3));
	
	///*清空链表*/
	//	SListClear(&s);
	//Printlist(&s);


	//有效的个数
	printf("size = %d\n",SListNode_Size(&s));

	//判空

	printf("%d\n",SListEmpty (&s));

	//添加
	pos = SlistFind(&s,4);
	SlistInsertAfter(pos,6);
	Printlist(&s);
	
	//删除
	SlistRemove (&s,pos);
	Printlist (&s);

	SlistPushback (&s,1);
	SlistPushback (&s,2);
	SlistPushback (&s,3);
	SlistPushback (&s,4);
	SlistPushback (&s,5);
	Printlist(&s);


	SlistRemoveAll(&s,2);
	Printlist(&s);
}
int main() {
	TestList();
	return 0;
}



猜你喜欢

转载自blog.csdn.net/weixin_44077227/article/details/89528775