单链表(C语言)基本操作

单链表:单向有序链表 最后置于空

#pragma once
#include<string.h>
#include<malloc.h>
#include<assert.h>

typedef int DataType;
typedef struct ListNode
{
	struct ListNode *_next;
	DataType _data;
}ListNode;

void PrintList(ListNode *&pHead)

{
	while(pHead)
	{
		printf("%d->",pHead->_data);
		pHead=pHead->_next;
	}
	printf("NULL\n");
}

ListNode* BuyNode(DataType x)
{
	ListNode *tmp=(ListNode *)malloc(sizeof(ListNode));
	tmp->_data=x;
	tmp->_next=NULL;

	return tmp;
}

void PushFront(ListNode *&pHead,DataType x)//首部插入
{ 
	if(pHead==NULL)
	{
		pHead=BuyNode(x);
	}
	else
	{
		ListNode *tmp=BuyNode(x);
		tmp->_next=pHead;
		pHead=tmp;
	}
}
void PopFront(ListNode *&pHead)//首部删除
{
	if(pHead!=NULL)
	{
		ListNode *del=pHead;
		pHead=del->_next;
		free(del);
	}
}
void PushBack(ListNode *&pHead,DataType x)//尾部插入
{ 
	if(pHead==NULL)
	{
		pHead=BuyNode(x);
	}
	else
	{
		ListNode *cur=pHead;
		while(cur->_next)
		{
			cur=cur->_next;
		}
		cur->_next=BuyNode(x);
	}
}
void PopBack(ListNode *&pHead)//尾部删除
{
	if(pHead==NULL)
	{
		return;
	}
	else if(pHead->_next==NULL)
	{
		free(pHead);
		pHead=NULL;
	}
	else
	{
		ListNode *cur=pHead;
		ListNode *prev=pHead;
		while(cur->_next)
		{
			prev=cur;
			cur=cur->_next;
		}
		prev->_next=NULL;
		free(cur);
	}
}

ListNode *Find(ListNode *&pHead,DataType x)//查找
{
	ListNode *cur=pHead;
	while(cur)
	{
		if(cur->_data==x)
		{
			return cur;
		}
		cur=cur->_next;
	}
	return NULL;
}

void  PopNoHead(ListNode  *pos)//删除无头单链表的非尾节点
{
	ListNode *del = pos->_next;
	assert(pos);
	pos->_data = del->_data;
	pos->_next = del->_next;
	free(del);
	del=NULL;
}

//Test.cpp

#include<stdio.h>
#include "List.h"

void Test1()//输入/出、查找
{
	ListNode *ret=NULL;
	ListNode *list=NULL;
	PushFront(list,1);
	PushFront(list,2);
	PushFront(list,3);
	PushFront(list,4);
	PushFront(list,5);

	PrintList(list);
	Find(list,4);

	PopFront(list);
	PopFront(list);
	PopFront(list);
	PopFront(list);
	PrintList(list);
}
时间: 2024-12-25 10:48:10

单链表(C语言)基本操作的相关文章

递归实现单链表的各种基本操作

1 #include<iostream> 2 using namespace std; 3 4 #define OK 1 5 #define ERROR 0 6 typedef int Status; 7 8 typedef struct LNode 9 { 10 int data; //结点的数据域 11 struct LNode *next; //结点的指针域 12 }LNode, *LinkList; //LinkList为指向结构体LNode的指针类型 13 14 void creat

单链表C语言实现(带头节点)

#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode { ElemType data; struct LinkNode *next; }LinkNode, *LinkList; LinkList InitNull(); LinkList InitListByHeadInsert(); void PrintList(LinkList L); LinkList InitLis

带头节点的单链表-------C语言实现

1 /***************************************************** 2 Author:Simon_Kly Version:0.1 Date:20170520 3 Description:带头接点的单链表 4 Mail:[email protected] 5 Funcion List: 6 *****************************************************/ 7 8 #include <stdio.h> 9 #

单链表实现及其基本操作

import java.util.HashMap; import java.util.Scanner; import java.util.Stack; /** * * @author kerryfish * 关于java中链表的操作 * 1. 求单链表中结点的个数: getListLength * 2. 将单链表反转: reverseList(遍历),reverseListRec(递归) * 3. 查找单链表中的倒数第K个结点(k > 0): reGetKthNode * 4. 查找单链表的中间

单链表 C语言实现 心得1

#include <stdio.h> #include <stdlib.h> #include <windows.h>#include <malloc.h>#include "math.h" typedef struct LNode { int data; struct LNode * next; //指向下一个结点的指针 }LNode; typedef struct LNode* LinkList; void InitList(Link

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构笔记5带头结点单链表

/* 本次操作是对带头节点单链表的操作  包括删除  插入 判空 建立  包括删除插入函数  显示函数 目的是为了对单链表做一个基本操作的总结----1*/ #include<stdio.h>#include<malloc.h>#include<conio.h>#define OK 1#define ERROR -1#define OVERFLOW -2#define ENDFLAG 0typedef struct LNode{ int data; struct LNo

小猪的数据结构辅助教程——2.2 线性表中的单链表

小猪的数据结构辅助教程--2.2 线性表中的单链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.理解顺序表以及单链表各自的有点以及缺点! 2.熟悉单链表的形式,对于头指针,头结点,尾结点,数据域和指针域这些名词要知道是什么! 3.熟悉单链表的结点结构 4.区分头指针与头结点! 5.熟悉创建单链表的两种方式:头插法和尾插法 6.了解单链表12个基本操作的逻辑 7.有趣的算法题:查找单链表的中间结点~ 1.单链表的引入(顺序表与单链表的PK) 2.单链表的结构图以及一些名

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客<C语言实现单链表(不带头结点)的基本操作>中具体实现了不带头结点的单链表的11种操作:如计算链表长度.初始化.创建链表.清空链表等等.但是在实际使用中,带头结点的单链表往往比不带头结点的单链表用的更多,使用也更为方便.因为不用单独考虑第一个节点的情况了,第一个节点和其他后续节点的处理全都一样了,简化操作.这篇博客将会来实现带头结点的单链表的11种操作.代码上传至: https://github.com/chenyufeng1991/LinkedList_HeadNode  .