单链表的增删查改等基本操作C++实现

单链表的初始化、增删查改、遍历一次找中间结点、删除一个无头单链表的非尾结点(不给头结点)

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct ListNode
{
	struct ListNode* _next;
	DataType _data;
}ListNode;
void InitList(ListNode* &pHead)
{
	pHead=NULL;
}
ListNode* CreatNode(DataType x)
{
	ListNode* tmp;
	tmp=(ListNode*)malloc(sizeof(ListNode));
	tmp->_data=x;
	tmp->_next=NULL;
	return tmp;
}
void PushFront(ListNode* &pHead,DataType x)
{
	ListNode* NewNode;
	if(pHead==NULL)
	{
		pHead=CreatNode(x);
		return;
	}
	else
	{
		NewNode=CreatNode(x);
		NewNode->_next=pHead;
		pHead=NewNode;
	}
}
void PushBack(ListNode* &pHead,DataType x)
{
	ListNode* tmp=CreatNode(x);
	if(pHead==NULL)
	{
		pHead=tmp;
		return;
	}
	else
	{
		ListNode* p=pHead;
		while(p->_next)
		{
			p=p->_next;
		}
		p->_next=tmp;
	}
}
void PopFront(ListNode* &pHead)
{
	if(pHead==NULL)
	{
		printf("链表为空");
		return;
	}
	else
	{
		pHead=pHead->_next;
	}
}
void PopBack(ListNode* &pHead)
{
	if(pHead==NULL)
	{
		printf("链表为空\n");
		system("pause");
		exit(0);
	}
	else if(pHead->_next==NULL)
	{
		pHead=NULL;
	}
	else
	{
		ListNode* tmp=pHead;
		while(tmp->_next->_next)
		{
			tmp=tmp->_next;
	    }
		tmp->_next=NULL;
	}
}
ListNode* Find(ListNode* pHead,DataType x)
{
	if(pHead==NULL)
	{
		printf("链表为空\n");
		system("pause");
		exit(0);
	}
	else
	{
		ListNode* tmp=pHead;
		while((tmp->_data!=x)&&(tmp->_next!=NULL))
		{
			tmp=tmp->_next;
		}
		if(tmp->_data==x)
		{
			return tmp;
		}
		else
		{
			printf("想找的数据不存在\n");
			system("pause");
			exit(0);
		}
	}
}
void Insert(ListNode* pos,DataType x)
{
	ListNode* NewNode=CreatNode(x);
	NewNode->_next=pos->_next;
	pos->_next=NewNode;
}
void Erase(ListNode* &pHead,ListNode* pos)
{
	while(pHead->_next!=pos)
	{
		pHead=pHead->_next;
	}
	pHead->_next=pos->_next;
}
//遍历一次找中间结点
ListNode* Cheak_MidNode(ListNode* pHead)
{
	ListNode* p1=pHead;
	ListNode* p2=pHead;
	int count=0;
	while(p1->_next)
	{
		p1=p1->_next;
		count++;
		if(count%2==0)
		{
			p2=p2->_next;
		}
	}
	return p2;
}
//删除一个无头单链表的非尾节点(不给头节点)
void Delete_NoHeadNode(ListNode* pos)
{
	pos->_data=pos->_next->_data;
	pos->_next=pos->_next->_next;
}
void Print(ListNode* pHead)
{
	while(pHead)
	{
		printf("%d->",pHead->_data);
		pHead=pHead->_next;
	}
	printf("NULL\n");
}
void Print_Node(ListNode* pHead,ListNode* pos)
{
	while(pHead!=pos)
	{
		pHead=pHead->_next;
	}
	printf("中间结点为:%d\n",pos->_data);
}
void Test1()
{
	ListNode* pHead;
	InitList(pHead);
	/*PushFront(pHead,1);
	PushFront(pHead,2);
	PushFront(pHead,3);*/
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	/*PopFront(pHead);
	PopFront(pHead);
	PopFront(pHead);
	PopFront(pHead);*/
	/*PopBack(pHead);
	PopBack(pHead);
	PopBack(pHead);
	PopBack(pHead);*/
	Print(pHead);
}
void Test2()
{
	ListNode* pHead;
	InitList(pHead);
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	ListNode* pos=Find(pHead,2);
	//ListNode* pos=Find(pHead,5);
	Insert(pos,7);
	Print(pHead);
	Erase(pHead,pos);
	Print(pHead);
}
void Test3()
{
	ListNode* pHead;
	InitList(pHead);
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	PushBack(pHead,4);
	PushBack(pHead,5);
	ListNode* pos=Cheak_MidNode(pHead);
	Print(pHead);
	Print_Node(pHead,pos);
}
void Test4()
{
	ListNode* pHead;
	InitList(pHead);
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	PushBack(pHead,4);
	Print(pHead);
	ListNode* pos=Find(pHead,3);
	Delete_NoHeadNode(pos);
    Print(pHead);
}
int main()
{
	//Test1();
	//Test2();
	//Test3();
	Test4();
	system("pause");
	return 0;
}
时间: 2024-10-07 04:10:12

单链表的增删查改等基本操作C++实现的相关文章

单链表的增删查 逆置 倒数第k个节点等问题

    对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增   删   插  查  改.      #include<stdio.h> #include<assert.h> #include<malloc.h> #include<stdlib.h> typedef int Datatype; typedef struct SListNode { Datatype data; struct SList

单向链表的增删查改

链表(Linked List) 链表是有序的列表 链表是以节点的方式来存储,是链式存储 每个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际需求来确定 单链表的增删改查 package linkedlist; import javax.swing.plaf.synth.SynthSeparatorUI; public class SingleLinkedListDemo { public static void ma

C语言链表的增删查改

小经验:在VS2017中,使用while(scanf(“%d”,&i)!= NULL){......}时,结束输入需要输入三次ctrl+z+空格 func.h #include <stdlib.h> #include <string.h> typedef struct student { int number; struct student* pnext; }stu, *pstu; void list_print(pstu);//打印 void list_head_inse

2.MyBatis对数据库单表的增删查改

转自: http://www.cnblogs.com/xdp-gacl/p/4262895.html 一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0/

c++单链表【构造函数、运算符重载、析构函数、增删查改等】

c++中的单向链表写法:实现增删查改.构造函数.运算符重载.析构函数等. 建立头文件SList.h #pragma once typedef int DataType; //SList要访问SListNode,可以通过友元函数实现,友元函数在被访问的类中 class SListNode { friend class SList;//友元函数 public: SListNode(const DataType x) :_data(x) , _next(NULL) {} private: SListN

c++双链表【构造函数、运算符重载、析构函数、增删查改及逆置等】

c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等) 建立头文件SList.h #pragma once typedef int DataType; class ListNode { friend class List;//友元函数 public: ListNode(const DataType x) :_data(x) , _prev(NULL) , _next(NULL) {} private: DataType _data; ListNode* _prev; L

c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)

本文的内容主要是,利用c++写出顺序表,并对写出的代码进行测试, 主要实现的功能:实现对顺序表的增删查改, 要写的函数:构造函数,赋值运算符重载,析构函数.在编写代码过程中应注意到深浅拷贝问题. 下面是顺序表的类函数: #pragma once #include<iostream> using namespace std; typedef int DataType; class SeqList { public: SeqList(); SeqList(DataType *array, size

mysql基础知识之增删查改使用介绍

 mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的student表中的数据如下: mysql> SELECT * FROM student; 一.SELECT语句的使用 1.单表查询 语法格式: SELECT culom1,culom2,culom3 FROM TABLE_NAME; 可以改变字段显示顺序 2.WHERE子句查询 语法格式: SE

asp.net MVC最简单的增删查改!(详)

折腾了两天搞出来,但原理性的东西还不是很懂,废话不多说上图上代码 然后右键models,新建一个数据模型 注意我添加命名为lianxi 添加后如上 接下来在controllers添加控制器还有在Views中添加视图 注意控制器lianxi和视图的名字要一致,然后视图我是添加了3个分别是Index,insert,Modify,在控制器里分别有三个对应的函数 每当用URL访问视图时,他就调用了controllers对应的方法,例如 jiaEntities 就是建立模式时那个数据链接的名字