程序检测
插入 ,头插,头删,尾删,寻找,检测链表,尾插,删除,移除相同
头文件
#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){
assert(plist);
SListClear (plist);
free(plist->head);
plist->head = NULL;
}
//添加节点
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 = NULL;
assret(plist);
Node = plist->head->Next;;
while(Node) {
plist->head->Next = Node->Next;
free(Node);
Node = plist->head->Next ;
}
}
//有效的个数
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;
assert(plist);
//首先头删
while(Node){
if(plist->head->data == data) {
SlistpopFront(plist);
continue; ;
}
//不是头删之后就看下一个是不是要删除的
//定义两个变量
//一个是当前节点
//另外一个就是下一个要删除的节点
Node = plist->head;
while(Node->Next!=NULL) {
if(Node->Next->data == data) {
temp = Node->Next;
Node->Next = temp->Next;
free(temp);
}
else {
Node = Node->Next;
}
}
return ;
}
}
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;
}