单链表


//-----------------------单链表操作---------------------------
 #include<stdio.h>
 #include<stdlib.h>
 
 typedef struct LearList
 {
 	int num;
 	struct LearList* pNext;
 }LearList;
 LearList* pHead = NULL;
 LearList* pTail = NULL;
 
 //函数声明
 LearList* CreateList();                //创建链表
 LearList* InsertList(int pPos,int num);//按位添加
 LearList* DeleteList(int pPos);        //按位删除
 void DeleteAll(LearList** pTemp);      //清空链表
 void ShowList(LearList* pTemp);        //显示链表
 
 //---------------------函数实现--------------------------
 
 //清空链表
 void DeleteAll(LearList** pTemp)
 {
	 LearList* p = NULL;
	 while(*pTemp)
	 {
		 p = *pTemp;
		*pTemp = (*pTemp)->pNext;//注意结合顺序:->优先级高于*
		free(p);
	 }
 }

 //按位置删除链表元素
  LearList* DeleteList(int nPos)
  {
	int i = 1;
	LearList* pTempFront = pHead;
	LearList* pTemp = NULL;
	LearList* pTempBack = NULL;
	int nCount = 0;
	LearList*pCount = pHead;
	while(pCount->pNext->pNext)
	{
		nCount++;
		pCount=pCount->pNext;
	}
	//如果删除的是头节点
	if(1==nPos)
	{
		pTemp=pTempFront;
		pHead = pTempFront->pNext;
		free(pTemp);
	}
	//如果删除的是尾节
	else if(nCount+2==nPos)
	{
		pTemp= pCount->pNext;
		pCount->pNext = NULL;
		free(pTemp);
	}
	//如果是删除中间节点
	else
	{
		for(i;i<nPos-1;i++)
		{
			pTempFront = pTempFront->pNext;
		}
		pTemp = pTempFront->pNext;
		pTempBack = pTempFront->pNext->pNext;
		pTempFront->pNext=pTempBack;
		free(pTemp);
	}
	return pHead;
  }

 //插入数字
LearList* InsertList(int nPos,int num)//要插入的位置,要插入的值
{
  LearList* pTempFront = pHead;
  LearList* pTempBack = NULL;
  LearList* pTemp = (LearList*)malloc(sizeof(LearList));
  LearList* pCount = pHead;
  int i=0;
  int maxSize=0;
  while(pCount!=NULL)
  {
	maxSize++;
	pCount=pCount->pNext;
  }
  if(nPos<0)
  {
	  printf("插入位置不存在\n");
  }
  else
  {
	  pTemp->num = num;
	  //如果在链表头插入
	  if(nPos==0)
	  {
		pTemp->pNext = pHead;
		pHead = pTemp;
	  }
	  //如果在链表尾插入
	  else if(nPos>=maxSize)
	  {
		  pTail->pNext=pTemp;
		  pTemp->pNext = NULL;
	  }

	  //如果在中间插入
	  else
	  {
		  for(i=1;i<nPos;i++)
		  {
			  pTempFront=pTempFront->pNext;
		  }
		  pTempBack = pTempFront->pNext;
		  //连接
		  pTempFront->pNext = pTemp;
		  pTemp->pNext = pTempBack;
	  }
  }
  return pHead;
}

 //创建链表
 LearList* CreateList()
 {
 	int num;
 	LearList* pTemp;
 	printf("请输入一个数");
 	scanf("%d",&num);
 	while(num)
 	{
 		pTemp = (LearList*)malloc(sizeof(LearList));//为节点分配空间
 		pTemp->num = num;//为节点赋值
 		pTemp->pNext =NULL;
 		if(!pHead)
 		{
 			pHead=pTemp;
 		}
 		else
 		{
 			pTail->pNext=pTemp;
 		}
 		pTail=pTemp;
 		printf("请输入一个数");
 		scanf("%d",&num);
 	}
 	//free(pTemp);//单独写一个函数来释放内存
	return pHead;
 }
 
 //显示链表
 void ShowList(LearList* pTemp)
 {
 	//LearList* pTemp = pHead;
 	while(pTemp)
 	{
 		printf("%d",pTemp->num);
 		pTemp = pTemp->pNext;
 	}
	printf("\n");
 }
 
 int main()
 {
	LearList* pTemp = NULL;
 	pTemp = CreateList();
	printf("创建链表\n");	
 	ShowList(pTemp);
	printf("插入元素\n");
	pTemp = InsertList(4,9);
	ShowList(pTemp);
	printf("删除元素\n");
	pTemp = DeleteList(4);
	ShowList(pTemp);
	printf("清空链表\n");
	DeleteAll(&pTemp);
	system("pause");
 	return 0;
 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值