一.单链表

二.代码

头文件

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

//单链表
typedef int SListNodeDatetype;
typedef struct SListNode
{
	SListNodeDatetype date;
	struct SListNode* next;
}SLN;

//打印链表
void SLNprint(SLN* plist); 

//创建新节点
SLN* SLNbuyNode(SListNodeDatetype x);

//尾插
void SLNpushBack(SLN** phead, SListNodeDatetype x);

//头插
void SLNpushFront(SLN** phead, SListNodeDatetype x);

//尾删
void SLNPopBack(SLN** phead);

//头删
void SLNPopFront(SLN** phead);

//查找
SLN* SLNFind(SLN* phead, SListNodeDatetype x);

//在指定位置pos之前插入一个节点
void SLNInsert(SLN** phead, SLN* pos, SListNodeDatetype x);

//在指定位置pos之后插入节点
void SLNInsertAfter(SLN* pos, SListNodeDatetype x);

//删除pos位置的的节点
void SLNErase(SLN** phead, SLN* pos);

//删除pos位置之后的节点
void SLNEraseAfter( SLN* pos);

//销毁链表
void SLNDestroy(SLN** phead);

实现文件

#include"SLN.h"
void SLNprint(SLN* phead)
{
	SLN* pour = phead;
	while (pour)
	{
		printf("%d->",pour->date );
		pour=pour->next;
	}
	printf("NULL\n");
}
SLN* SLNbuyNode(SListNodeDatetype x)
{
	SLN* newnode =(SLN*) malloc(sizeof(SLN));
	if (newnode == NULL)
	{
		perror("malloc fail!");
		exit(1);
	}
	newnode->date = x;
	newnode->next =NULL;
	return newnode;
}
void SLNpushBack(SLN** phead, SListNodeDatetype x)
{
	assert(phead);
	SLN* newnode = SLNbuyNode(x);
	if (*phead == NULL)
	{
		*phead = newnode;
	}
	else
	{
		SLN* ptail = *phead;
		while (ptail->next)
		{
			ptail=ptail->next;
		}
		ptail->next = newnode;
	}
}
void SLNpushFront(SLN** phead, SListNodeDatetype x)
{
	assert(phead);
	SLN* newnode = SLNbuyNode(x);
	newnode->next = *phead;
	*phead = newnode;
}
void SLNPopBack(SLN** phead)
{
	assert(phead && *phead);
	if ((*phead)->next == NULL)
	{
		free(*phead);
		*phead = NULL;
	}
	else
	{
		SLN* pre = NULL;
		SLN* ptail = *phead;
		while (ptail->next)
		{
			pre = ptail;
			ptail = ptail->next;

		}
		pre->next = NULL;
		free(ptail);
		ptail = NULL;
	}
}void SLNPopFront(SLN** phead)
{
	assert(phead&&*phead);
	SLN* next = (*phead)->next;
	free(*phead);
	*phead = next;
}

SLN* SLNFind(SLN* phead, SListNodeDatetype x)
{
	SLN* pour = phead;
	while (pour)
	{
		if (pour->date == x)
		{
			return pour;
		}
		pour = pour->next;
	}
	return NULL;
}
void SLNInsert(SLN** phead, SLN* pos, SListNodeDatetype x) 
{
	assert(phead && *phead);  
	if (pos == *phead)
	{
		SLNpushFront(phead,x);
	}
	else
	{
		SLN* newnode = SLNbuyNode(x);
		SLN* pre = *phead;
		while (pre->next != pos)
		{
			pre = pre->next;
		}
		pre->next = newnode;
		newnode->next = pos;
	}
}
void SLNInsertAfter(SLN* pos, SListNodeDatetype x) 
{
	assert(pos);
	SLN* newnode = (SLN*)SLNbuyNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}
void SLNErase(SLN** phead, SLN* pos)
{
	assert(phead && *phead&& pos);
	if (pos == *phead)
	{
		SLNPopFront(phead);
	}
	else
	{
		SLN* pre = *phead;
		while (pre->next != pos)
		{
			pre = pre->next;
		}
		pre->next = pos->next;
		free(pos);
		pos = NULL;
	}
}
void SLNEraseAfter(SLN* pos)
{
	assert(pos&&pos->next);
	SLN* der = pos->next;
	pos->next = der->next;
	free(der);
	
}
void SLNDestroy(SLN** phead)
{
	SLN* der = *phead;
	while (der)
	{
		SLN* next = der->next;
		free(der);
		der = next;
	}
	*phead = NULL;
}

测试文件

#include"SLN.h"

void test01()//尾插
{
    SLN* pplist = NULL;
    printf("操作之前:");
    SLNprint(pplist);
    SLNpushBack(&pplist, 1);
    SLNpushBack(&pplist, 44);
    SLNpushBack(&pplist, 33);
    SLNpushBack(&pplist, 22);
    SLNpushBack(&pplist, 12);
    printf("操作之后:");
    SLNprint(pplist);
}

void test02()//头插
{
    SLN* pplist = NULL;
    printf("操作之前:");
    SLNprint(pplist);
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之后:");
    SLNprint(pplist);
}

void test03()//尾删
{
    SLN* pplist = NULL;
    SLNpushBack(&pplist, 33);
    SLNpushBack(&pplist, 35);
    SLNpushBack(&pplist, 43);
    SLNpushBack(&pplist, 323);
    SLNpushBack(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLNPopBack(&pplist);
    SLNPopBack(&pplist);
    printf("操作之后:");
    SLNprint(pplist);
}

void test04()//头删
{
    SLN* pplist = NULL;
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLNPopFront(&pplist);
    SLNPopFront(&pplist);
    printf("操作之后:");
    SLNprint(pplist);
}

void test05()//查找
{
    SLN* pplist = NULL;
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLN* find = SLNFind(pplist, 35);
    if (find)
    {
        printf("找到了,地址:%p\n", find);
    }
    else
    {
        printf("没找到\n");
    }
}

void test06()//在指定位置pos之前插入一个节点
{
    SLN* pplist = NULL;
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLN* find = SLNFind(pplist, 35);
    if (find)
    {
        printf("找到了,地址:%p\n", find);
    }
    else
    {
        printf("没找到\n");
    }
    SLNInsert(&pplist, find, 66);
    printf("操作之后:");
    SLNprint(pplist);
}

void test07()//在指定位置pos之后插入节点
{
    SLN* pplist = NULL;
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLN* find = SLNFind(pplist, 35);
    if (find)
    {
        printf("找到了,地址:%p\n", find);
    }
    else
    {
        printf("没找到\n");
    }
    SLNInsertAfter(find, 66);
    printf("操作之后:");
    SLNprint(pplist);
}

void test08()//删除pos位置的的节点
{
    SLN* pplist = NULL;
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLN* find = SLNFind(pplist, 35);
    if (find)
    {
        printf("找到了,地址:%p\n", find);
    }
    else
    {
        printf("没找到\n");
    }
    SLNErase(&pplist, find);
    printf("操作之后:");
    SLNprint(pplist);
}

void test09()//删除pos位置之后的节点
{
    SLN* pplist = NULL;
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLN* find = SLNFind(pplist, 35);
    if (find)
    {
        printf("找到了,地址:%p\n", find);
    }
    else
    {
        printf("没找到\n");
    }
    SLNEraseAfter(find);
    printf("操作之后:");
    SLNprint(pplist);
}

void test10()//销毁链表
{
    SLN* pplist = NULL;
    SLNpushFront(&pplist, 33);
    SLNpushFront(&pplist, 35);
    SLNpushFront(&pplist, 43);
    SLNpushFront(&pplist, 323);
    SLNpushFront(&pplist, 43);
    printf("操作之前:");
    SLNprint(pplist);
    SLNDestroy(&pplist);
    printf("操作之后:");
    SLNprint(pplist);
}

int main()
{
    test01();
    test02();
    test03();
    test04();
    test05();
    test06();
    test07();
    test08();
    test09();
    test10();
    return 0;
}

运行结果截图(VS2022 Debug X64)
在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐