首页 > 编程语言 >C语言单向链表的创建和增删减查相关程序

C语言单向链表的创建和增删减查相关程序

时间:2024-04-22 21:00:11浏览次数:31  
标签:结点 减查 Head next 链表 LList C语言 data

对单向链表进行删除和插入的程序设计


/*******************************************************************
*

*	file name:	linkedlist.c
*	author	 :  [email protected]
*	date	 :  2024/04/22
*	function :  实现单向链表的创建、拆入、删除功能
*	note	 :  None
  *
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
  *
*	*****************************************************************/

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

//指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct LinkedList
{
	DataType_t  		 data; //结点的数据域
	struct LinkedList	*next; //结点的指针域

}LList_t;


/*************************************************************************
*

*  func name:	LList_Create

*  author	 :  [email protected]

*  date	 :  2024/04/22

*  function :  实现单向链表中的头结点创建

*   note	 :  None
    *

*  CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
   *

* ***********************************************************************/
  //创建一个空链表,空链表应该有一个头结点,对链表进行初始化
  LList_t * LList_Create(void)
  {
  //1.创建一个头结点并对头结点申请内存
  LList_t *Head = (LList_t *)calloc(1,sizeof(LList_t));
  if (NULL == Head)
  {
  	perror("Calloc memory for Head is Failed");
  	exit(-1);
  }

  //2.对头结点进行初始化,头结点是不存储有效内容的!!!
  Head->next = NULL;

  //3.把头结点的地址返回即可
  return Head;
  }

/*************************************************************************
*

*  func name:	LList_NewNode

*  author	 :  [email protected]

*  date	 :  2024/04/22

*  function :  实现单向链表的结点创建

*   note	 :  None
    *

*  CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
   *

* ***********************************************************************/
  //创建新的结点,并对新结点进行初始化(数据域 + 指针域)
  LList_t * LList_NewNode(DataType_t data)
  {
  //1.创建一个新结点并对新结点申请内存
  LList_t *New = (LList_t *)calloc(1,sizeof(LList_t));
  if (NULL == New)
  {
  	perror("Calloc memory for NewNode is Failed");
  	return NULL;
  }

  //2.对新结点的数据域和指针域进行初始化
  New->data = data;
  New->next = NULL;
  return New;
  }

/*************************************************************************
*

*  func name:	LList_HeadInsert

*  author	 :  [email protected]

*  date	 :  2024/04/22

*  function :  实现单向链表结点头插

*   note	 :  None
    *

*  CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
   *

* ***********************************************************************/
  //头插
  bool LList_HeadInsert(LList_t *Head,DataType_t data)
  {
  //1.创建新的结点,并对新结点进行初始化
  LList_t *New = LList_NewNode(data);
  if (NULL == New)
  {
  	printf("can not insert new node\n");
  	return false;
  }

  //2.判断链表是否为空,如果为空,则直接插入即可
  if (NULL == Head->next)
  {
  	Head->next = New;
  	return true;
  }

  //3.如果链表为非空,则把新结点插入到链表的头部
  New->next  = Head->next;
  Head->next = New;

  return true;
  }

/*************************************************************************
*

*  func name:	LList_TailInsert

*  author	 :  [email protected]

*  date	 :  2024/04/22

*  function :  实现单向链表结点尾插

*   note	 :  None
    *

*  CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
   *

* ***********************************************************************/
  //尾插
  bool LList_TailInsert(LList_t* Head, DataType_t data)
  {
  //1.创建新的结点,并对新结点进行初始化
  LList_t* New = LList_NewNode(data);
  if (NULL == New)
  {
  	printf("can not insert new node\n");
  	return false;
  }
  //2.判断链表是否为空,如果为空,则退出
  if(NULL == Head->next)
  {
  	return false;
  }
  //对链表的头文件的地址进行备份
  LList_t* Phead = Head;

  //首结点
  while (Phead->next)
  {
  	//把头的直接后继作为新的头结点
  	Phead = Phead->next;
  }
  Phead->next = New;
  New->next = NULL;
  return true;
  }

/*************************************************************************
*

*	func name:	LList_DestInsert
*	author	 :  [email protected]
*	date	 :  2024/04/22
*	function :  实现单向链表指定位置插入结点
*	note	 :  None
  *
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
  *
*	***********************************************************************/
  //任意插
  bool LList_DestInsert(LList_t* Head, DataType_t dest, DataType_t data)
  {
  //1.创建新的结点,并对新结点进行初始化
  LList_t* New = LList_NewNode(data);
  if (NULL == New)
  {
  	printf("can not insert new node\n");
  	return false;
  }
  //2.判断链表是否为空,如果为空,则直接插入即可
  if (NULL == Head->next)
  {
  	return false
  }
  //对链表的头文件的地址进行备份
  LList_t* Phead1 = Head;
  LList_t* phead2 = Head;
  for (int i = 0; i < dest; i++)
  {
  	//目标前驱地址
  	Phead1 = Phead1->next;
  }
  for (int j = 0; j <= dest; j++)
  {
  	//目标后继地址
  	Phead2 = Phead2->next;
  }
  New->next = Phead2;
  Pheadl-> = New;
  return true;
  }

/*************************************************************************
*

*	func name:	LList_HeadDele
*	author	 :  [email protected]
*	date	 :  2024/04/22
*	function :  实现单向链表头结点删除
*	note	 :  None
  *
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
  *
*	***********************************************************************/
  //头删
  bool LList_HeadDele(LList_t* Head)
  {
  //1.判断链表是否为空,如果为空,则直接返回
  if (NULL == Head->next)
  {
  	return false;
  }
  LList_t* Phead = Head->next;
  //2.如果链表为非空,则删除头结点
  Head->next = Head->next->next;
  Head->next->next == NULL;
  free(Phead);
  return true;
  }

/*************************************************************************
*

*  func name:	LList_TailDele

*  author	 :  [email protected]

*  date	 :  2024/04/22

*  function :  实现单向链表尾结点删除

*   note	 :  None
    *

*  CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
   *

* ***********************************************************************/
  //尾删
  bool LList_TailDele(LList_t* Head)
  {
  //1.判断链表是否为空,如果为空,则直接返回
  if (NULL == Head->next)
  {
  	return false;
  }

  //对链表的头文件的地址进行备份
  LList_t* Phead1 = Head;
  LList_t* Phead2 = Head;

  //首结点开始进行遍历
  int count = 0;
  while (Phead1->next)
  {
  	//记录前驱地址
  	Phead1 = Phead1->next;
  	//记录循环次数
  	count++;
  }
  for (int i = 0; i < count - 1; i++)
  {
  	//记录后继地址
  	Phead2 = Phead2->next;
  }
  Phead2->next = NULL;
  free(Phead1);
  return true;
  }

/*************************************************************************
*

*  func name:	LList_DestDele

*  author	 :  [email protected]

*  date	 :  2024/04/22

*  function :  实现单向链表指定数值的结点删除

*   note	 :  None
    *

*  CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
   *

* ***********************************************************************/
  //任意删
  bool LList_DestDele(LList_t* Head, DataType_t data)
  {
  //1.判断链表是否为空,如果为空,则直接返回
  if (NULL == Head->next)
  {
  	return false;
  }
  //对链表的头文件的地址进行备份
  LList_t* Phead1 = Head;
  LList_t* Phead2 = Head;

  //首结点开始进行遍历
  int count = 0;
  while (Phead1->next)
  {
  	Phead1 = Phead1->next;
  	count++;
  	//找到data的值所在位置
  	if (data == Phead1->data)
  	{
  		break;
  	}
  }
  for (int i = 0; i < count + 1; i++)
  {
  	Phead2 = Phead2->next;
  }
  Phead1->next = Phead2->next;
  Phead2-> = NULL;
  free(Phead2);
  return true;
  }

/*************************************************************************
*

*  func name:	LList_Print

*  author	 :  [email protected]

*  date	 :  2024/04/22

*  function :  实现输出所有单向链表结点中的数据

*   note	 :  None
    *

*  CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
   *

* ***********************************************************************/
  //遍历输出
  void LList_Print(LList_t* Head)
  {
  //对链表的头文件的地址进行备份
  LList_t* Phead = Head;

  //首结点
  while (Phead->next)
  {
  	//把头的直接后继作为新的头结点
  	Phead = Phead->next;

  	//输出头结点的直接后继的数据域
  	printf("data = %d\n", Phead->data);

  }
  }

int main(int argc, char const *argv[])
{

	return 0;

}





//删除单链表L(有头结点)中的一个最小值结点
/*************************************************************************
*

*	func name:	LList_Print
*	author	 :  [email protected]
*	date	 :  2024/04/22
*	function :  实现输出所有单向链表结点中的数据
*	note	 :  None
  *
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
  *
*	***********************************************************************/
  bool LList_DeleMin(LList_t* Head)
  {
  //对链表的头文件的地址进行备份
  LList_t* Phead1 = Head->next;
  LList_t* Phead2 = Head;
  LList_t* Phead3 = Head;
  LList_t* Phead4 = Head;
  int temp = Phead1->data;
  //首结点开始进行遍历
  int count = 0;
  while (Phead2->next)
  {
  	Phead2 = Phead2->next; //遍历到尾的地址
  	//找到data的值所在位置
  	if (temp>=Phead2->data)
  	{
  		temp = Phead2->data;
  	}
  }
  while (Phead3->next)
  {
  	Phead3 = Phead3->next;
  	count++;
  	if (Phead3->data == temp)
  	{
  		break;
  	}
  }
  for (int i = 0; i < count + 1; i++)
  {
  	Phead4 = Phead4->next;
  }
  Phead3->next = Phead3->next;
  Phead4-> = NULL;
  free(Phead4);
  return true;
  }


/*假设该链表只给出了头指针 head。在不改变链表的前提下,请设计一个尽可能高效的算法,
查找链表中倒数第k(k为正整数个位置上的结点。若查找成功,算法输出该结点的data值,并返回1,否则,只返回0。*/
/*************************************************************************
*

*	func name:	LList_FindDataPut
*	author	 :  [email protected]
*	date	 :  2024/04/22
*	function :  实现查找链表中倒数第k个位置上的结点的值
*	note	 :  None
  *
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
  *
*	***********************************************************************/
  int LList_FindDataPut(LList_t* Head,unsigned int k)
  {
  int count = 0;
  LList_t* Phead1 = Head;
  LList_t* Phead2 = Head;
  while (Phead1->next)
  {
  	Phead1 = Phead1->next; //遍历到尾的地址
  	count++;
  }
  if (k > count) //找不到的情况
  {
  	printf("can not find K-th to last data = %d\n")
  	return 0;
  }
  for (int i = 0; i < count - k; i++)
  {
  	//找到倒数第k个的地址
  	Phead2 = Phead2->next;
  }
  printf("K-th to last data = %d\n", Phead2->data);
  return 1;
  }

标签:结点,减查,Head,next,链表,LList,C语言,data
From: https://www.cnblogs.com/wh217/p/18151540

相关文章

  • 删除链表中最小的一个结点
    include<stdio.h>include<stdbool.h>include<stdlib.h>//指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造链表的结点,链表中所有结点的数据类型应该是相同的typedefstructLinkedList{DataType_tdata;//结点......
  • 实验3 C语言函数应用编程
    //task1.c#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);//函数声明voidprint_spaces(intn);//函数声明voidprint_blank_lines(intn);//函数声明in......
  • 删除链表中的尾部结点
    删除链表中的尾部结点/********************************************************name:DelTailNode* function:删除链表尾部结点*argument*@head:链表头结点的地址**retval:成功返回1,失败返回0*author:Dazz*......
  • 《渣男代码历险记》第五章:设计一个算法删除单链表L(有头结点)中的一个最小值结点
    为了删除单链表L中的一个最小值结点,我们可以遍历链表,找到最小值结点及其前驱结点,然后修改前驱结点的指针,使其指向最小值结点的下一个结点。以下是算法的解析和代码实现:初始化两个指针pre和cur,分别指向头结点和头结点的下一个结点。初始化一个变量min_val,用于存储当前最小值,将其......
  • C语言实现链表增删减改
    /********************************************************************filename: main.cauthor :[email protected] :2024/04/22function:实现对链表的增删改查note :NoneCopyRight(c)[email protected]***......
  • 单向顺序链表的创建,增,删,减,查
    单向顺序链表的创建,增,删,减,查/********************************************************************* filename: 单向顺序链表的创建,增,删,减,查* author :[email protected]* date : 2024-4-22* function:* note :None** CopyRight(c)20241764......
  • 对链表中最小数据项对应的结点删除
    //指的是顺序表中的元素的数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造链表SeqList—_t的结点,结点中包含数据域和指针域,并且所有结点中的数据应该相同typedefstructSeqList{DataType_tData;structSeqList*next;}LinkList_t;//创建......
  • 设计一个算法删除单链表L(有头结点)中的一个最小值结点。
    思路1:定义一个变量=遍历每一个当前地址下面的数据和下一个作比较,谁小把谁的值给这个变量,同时记录这个小值的位置i,依次遍历比较,得到最小值和最小值的结点i的值,然后删除这个结点。思路2:给两个指针,p1,p2开始都指向第一个,然后p2指向下一个地址,和p1下的data作比较,得到的小值的p不动......
  • 基于C语言的顺序表的建立,及各类功能函数实现
    常规链表建立列举常见的顺序表功能实现函数,进行编程练习常规顺序表(sequeue)建立定义一个顺序表的大小,结构体中采用数组而不是另一个堆内存空间表示存储的数据信息。typedefintdata_t;//定义顺序表中数据元素的数据类型#defineN20//定义顺序表的容量typed......
  • 实验3 C语言函数应用编程
    实验任务11#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);//函数声明8voidprint_spaces(intn);//函数声明9voidprint......