单向链表的头插法、尾插法以及插入、删除

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100//定义线性表空间的初始存储大小为
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;


typedef  struct Node
{
    ElemType data;//数据域
    struct Node *next;//指针域
}Node,*LinkList;

//typedef struct Node  LinkList;//定义LinkList,也可以直接写在上一个Node后面


void Init_List(LinkList *L)//初始化链表
{

    *L=(LinkList)malloc(sizeof(Node));//L是二级指针
    (*L)->next=NULL;


}
Status Insert_List_Head(LinkList *L)//头插法
{


    LinkList p, s;//p s都是指针变量
    p =*L;//p等同于头指针,指向头节点
for(int i=1;i<=10;i++)
{

    s = (LinkList) malloc(sizeof(Node));//为结点s申请空间
    s->data = i;
    s->next = p->next;
    p->next = s;// s->next=p->next;  p->next=s顺序不能反
}

        return OK;


}

Status Insert_List_Tail(LinkList *L)//尾插法
{

    LinkList p,s;//p s都是指针变量
    p=*L;
    for(int i=1;i<=10;i++) {
        s = (LinkList) malloc(sizeof(Node));//为结点s申请空间
        s->data = i;
        p->next = s;
        p = s;//p永远指向最后一个结点
        s->next = NULL;
    }
    return OK;
}

Status Insert(LinkList *L,int i,ElemType e)//在某个位置插入元素e
{
   int j=1;
   LinkList  p,s;
   p=*L;//p等同于头指针,指向头结点
   while(p&&j<i)//查找第i-1个结点
   {
       p=p->next;
       j++;
   }
   if(j>i||!p)
       return ERROR;

    s = (LinkList) malloc(sizeof(Node));//为结点s申请空间
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;

}

Status Delete(LinkList *L,int i)
{
    int j=1;
    LinkList  p,q;
    p=*L;//p等同于头指针,指向头结点
    while(p&&j<i)//查找第i-1个结点
    {
        p=p->next;
        j++;
    }
    if(j>i||!p)
        return ERROR;
    q=p->next;
    p->next=q->next;
    return OK;
}

void Print_List(LinkList *L)//打印链表
{
    LinkList p=(*L)->next;//p指向头结点
    while(p) {//要写成p,不能p->next
        printf("%d ", p->data);
        p=p->next;
    }
    printf("\n");
}

int main()
{
    LinkList L1,L2;//只可以写成LinkList L1,L2,不能写成*L1 *L2,后面传参用L1 L2
    Init_List(&L1);
    Insert_List_Head(&L1);
    printf("头插法的结果:");
    Print_List(&L1);


    Init_List(&L2);
    Insert_List_Tail(&L2);
    printf("尾插法的结果:");
    Print_List(&L2);

    if(Insert(&L1,1,0))
        Print_List(&L1);
    if(Delete(&L1,11))
        Print_List(&L1);



    return 0;
}

在这里插入图片描述
头插法逆序输出,尾插法正序输出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodePanda@GPF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值