c语言单链表的插入与删除可运行

#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);
}

在这里插入图片描述

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值