[数据结构]——单链表(动态申请结点单链表打印头插尾插头删尾删)

Posted FortunateJA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[数据结构]——单链表(动态申请结点单链表打印头插尾插头删尾删)相关的知识,希望对你有一定的参考价值。

SList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>	 

typedef int SLTDataType;

typedef struct SListNode

	SLTDataType data;
	struct SListNode* next;
SListNode;

SListNode* BuySListNode(SLTDataType x); //动态申请结点
void SListPrint(SListNode *phead); //单链表打印

void SListPushFront(SListNode **pphead, SLTDataType x);	//头插
void SListPushBack(SListNode **pphead, SLTDataType x);  //尾插
void SListPopFront(SListNode **pphead);	//头删
void SListPopBack(SListNode **pphead);  //尾删

SList.c

#include "SList.h"


SListNode* BuySListNode(SLTDataType x) //动态申请结点

	SListNode *tmp = (SListNode *)malloc(sizeof(SListNode));
	if (tmp == NULL)
	
		printf("malloc fail\\n");
		exit(-1);
	
	tmp->data = x;
	tmp->next = NULL;
	return tmp;


void SListPrint(SListNode *phead) //单链表打印

	SListNode *temp = phead;
	while (temp != NULL)
	
		printf("%d->", temp->data);
		temp = temp->next;
	
	printf("NULL\\n");


/*头插和尾插要考虑两种情况:
1.pphead指向空链表
2.pphead指向的链表有两个或超过两个结点*/

void SListPushFront(SListNode **pphead, SLTDataType x) //头插	

	SListNode *temp = BuySListNode(x);
	if (*pphead == NULL)
	
		*pphead = temp;
	
	else
	
		temp->next = *pphead;
		*pphead = temp;
	


void SListPushBack(SListNode **pphead, SLTDataType x)  //尾插

	SListNode *temp = BuySListNode(x);
	if (*pphead == NULL)
	
		*pphead = temp;
	
	else
	
		SListNode *cur = *pphead;
		while (cur->next != NULL)
		
			cur = cur->next;
		
		cur->next = temp;
	


/*头删和尾删要考虑三种情况:
1.pphead指向空链表
2.pphead指向的链表只有一个结点
3.pphead指向的链表有多个结点*/

void SListPopFront(SListNode **pphead)	//头删

	if (*pphead == NULL)
		return;
	else if ((*pphead)->next == NULL)
	
		free(*pphead);
		*pphead = NULL;
	
	else  ///
	
		/*
		SListNode *temp = *pphead;
		*pphead = (*pphead)->next;
		free(temp);
		temp = NULL;  */
		SListNode* next = (*pphead)->next;
		free(*pphead);

		*pphead = next;
	


void SListPopBack(SListNode **pphead)   //尾删

	if (*pphead == NULL)
		return;
	else if ((*pphead)->next == NULL)
	
		free(*pphead);
		*pphead = NULL;
	
	else
	
		SListNode *temp = *pphead;
		SListNode *cur = NULL;
		while (temp->next != NULL)
		
			cur = temp;
			temp = temp->next;
		
		free(temp);
		temp = NULL;
		cur->next = NULL;
	


Test.c

#include "SList.h"


int main()

	SListNode *phead = NULL;

	SListPushFront(&phead, 1);
	SListPushFront(&phead, 2);
	SListPushFront(&phead, 3);
	printf("PushFront:");
	SListPrint(phead);

	SListPushBack(&phead, 1);
	SListPushBack(&phead, 2);
	SListPushBack(&phead, 3);

	printf("PushBack:");
	SListPrint(phead);

	SListPopFront(&phead);
	printf("PopFront:");
	SListPrint(phead);

	SListPopBack(&phead);
	printf("PopBack:");
	SListPrint(phead);

	return 0;


测试结果

以上是关于[数据结构]——单链表(动态申请结点单链表打印头插尾插头删尾删)的主要内容,如果未能解决你的问题,请参考以下文章

[数据结构]——单链表(动态申请结点单链表打印头插尾插头删尾删)

单链表之头插法的理解!

单链表创建之--头插法创建带头结点的单链表,超详细

数据结构之单链表

数据结构之单链表

单链表基本操作