//-----------------------单链表操作---------------------------
#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;
}
单链表
最新推荐文章于 2023-05-06 22:43:40 发布