#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode//单链表结点类型
{
int data;
struct LNode *next;//指针指向下一个与自己类型相同的结构体类型
}LNode,*LinkList;
bool LinkInsert(LinkList &L,int i,int e)//插入一个元素
{
if(i<1)
return false;
LNode *p;
int j=0;//第一个节点指的是第一个有数据的节点
p=L;//p指向头结点
while(p!=NULL&&j<i-1)//找到第i-1个结点
{
p=p->next;
j++;
}
if(p==NULL)//针对找不到i-1个节点的情况
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));//申请一个新的结点
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
LinkList create_list(void)//创建一个链表
{
int length;//存放有效节点的个数
int i;
int e;//用来临时存放用户输入节点的值
LNode*L=(LNode*)malloc(sizeof(LNode));
if(NULL==L)
{
printf("分配失败,程序终止\n");
exit(-1);
}
LNode * pTail=L;//创建一个尾指针指向头结点
pTail->next=NULL;
printf("请输入您需要生成链表节点的个数:length=");
scanf("%d",&length);
for(i=0;i<length;++i)
{
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&e);
LNode*pNew=(LNode*)malloc(sizeof(LNode));//为新节点分配内存
if(NULL==pNew)
{
printf("分配失败,程序终止");
exit(-1);
}
pNew->data=e;
pTail->next=pNew;
pNew->next=NULL;
pTail=pNew;
}
return L;//必须将头指针的地址返回,否则遍历函数或者求长度的函数调用都无法实现
}
void TraverseList(LinkList L)//遍历链表
{
LNode* p=L->next;
while(NULL!=p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return;
}
void ListLength(LinkList L)//求链表长度
{
LinkList p=L->next;
int len=0;
while(NULL!=p)
{
++len;
p=p->next;
}
printf("本链表的长度是%d\n",len);
}
bool ListDelete(LinkList &L,int i,int &e)//删除一个元素
{
if(i<1)
return false;
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i-1)//循环找到要删除的前一个结点
{
p=p->next;
j++;
}
if(p==NULL)
return false;
if(p->next==NULL)
return false;
LNode *q=p->next;
e=q->data;
printf("删除的元素为%d\n",e);
p->next=q->next;
free(q);//释放结点的存储空间
return true;
}
int main()
{
int e;
LinkList L=NULL;
L=create_list();
if(LinkInsert(L,2,3))
{
printf("插入成功");
}
else
{
printf("插入失败");
}
TraverseList(L);
ListLength(L);
if(ListDelete(L,3,e))
{
printf("删除成功");
}
else
{
printf("删除失败");
}
TraverseList(L);
}
c语言单链表的插入与删除可运行
最新推荐文章于 2023-06-05 15:59:48 发布