单链表的操作的实现,增 删 改 查

我这篇是线性表的链式存储的基本操作的实现!
我会在接下来的时间把数据结构的基本的操作全部实现
觉得RGG写的不错,对你有一点儿帮助的话,请点个赞吧呜呜呜。(先赞后看,文明观看)
不多说,上代码
多看我的注释,我把一些要注意的问题都写在上面了。
对了,我想个这个系列取个名字,欢迎大家评论啊!
我倒要看看哪个幸运鹅是第一个给我评论的哈哈哈!

#include<stdio.h>

#define elemtype int
#define null 0
//定义单链表

/*******1,其中包含一个data,和一个它本身类型的指针
        2,给这个结构体取了两个别名,一个是LNode型,一个是LNode *型
        也就是说  LNode * p 等价于 LinkList p;
**********/

/*******
 1,注意在用指针的指针时,把*L先赋给一个指针r 再进行使用
 2,如果不用1 的话,就给*L加一个括号
******/

/*1,值传递
  2,指针传递 的隐操作就是 LinkList *L = &L;
  3,引用传递就是为变量取一个别名
*/



typedef struct LNode{
    elemtype data;
    struct LNode *next;
}LNode,*LinkList;



//有头节点的 头插法
void List_HeadInsert(LinkList *L){
    (*L) = (LinkList)malloc(sizeof(LNode));
    LinkList r=*L;        
    (*L)->next = null;
    LNode *s ;
    elemtype x;
    scanf("%d",&x);
    while(x!=7777){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        s->next =r->next;
        r->next = s;
        scanf("%d",&x);
    }
}

//遍历链表
void PrintfLinkList(LinkList L){
    LNode *p = L;
    if(L->next == null){
        printf("this LinkList is null!");
    }while(p->next!=null){
        printf("%d  ",p->next->data);
        p=p->next;
    }
}

//清空链表
void ClearLinkList(LinkList *L){
    LinkList r = *L;
    free(r);
}


//尾插法建立单链表(带头结点的)
void List_TailInsert(LinkList *L){
    LNode *R = *L;
    int x;
    //R=(LinkList)malloc(sizeof(LNode));
    LNode *s;
    LNode *r=R;            //r为表尾指针
    //第一步找到链表尾结点 r 的位置
    while(r->next!=null){
        r=r->next;
    }

    scanf("%d",&x);
    while(x!=7777){
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next = null;
}

//按序号查找结点值
//i为要查找的第i个结点
LNode *GetElem(LinkList L,int i){
    LNode *p = L;
    int j=1;
    if(i==0){
        return p;
    }
    if(i<1){
        return null;
    }
    while(p->next&&j<i){
        p=p->next;
        j++;
    }
    return p->next;
}

//按值查找
LNode *LocateElem(LinkList L,elemtype e){
    LNode *p=L->next;
    while(p!=null&&p->data!=e){
        p=p->next;
    }
    return p;
}

//插入操作(在第i个元素之前插入一个结点)
void LinkList_Insert(LinkList *L,int i,elemtype e){
    //第一步:判断i值的合法性
    if(i<=0){
        printf("defeat to insert!");
    }
    //第二步:进行插入操作
    if(i>=1&&GetElem(*L,i-1)!=null){
        LNode *R = *L;
        LNode *p;
        LNode *q;
        LNode *s;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=e;
        p = GetElem(R,i-1);
        q = p->next;

        //前插
        s->next=p->next;
        p->next=s;
    }else{
        printf("defeat!");
    }
}

//删除结点
void LinkList_Delete(LinkList *L,int i){
    LNode *p,*q,*R = *L;
    p = GetElem(R,i-1);
    q = p->next;
    if(p&&q){
        p->next = q->next;
        free(q);
    }
    else{
        free(p);
        free(q);
    }
}
//求表长
int GetList_Length(LinkList L){
    int i=0;
    LNode *p = L->next;
    while(p!= null){
        i=i+1;
        p=p->next;
    }
    return i;
}


int main(){
    LinkList L; //定义一个链表

    //头插法
    printf("please input some data until you input 7777 to halt it\n");
    List_HeadInsert(&L);
    printf("this is HeadInsert:\n");
    PrintfLinkList(L);

    printf("\n");
    //尾插法
    //ClearLinkList(&L);
    printf("this is List_TailInsert:\n");
    List_TailInsert(&L);
    PrintfLinkList(L);
    printf("\n");
    //按序号查找结点值
    int t=GetElem(L,3)->data;
    printf("the thrid value is :");
    printf("%d \n",t);

    //按值查找
    //  LocateElem(L,6);
    printf("LocateElem:");
    printf("%d\n",LocateElem(L,6)->data);

    //插入操作
    LinkList_Insert(&L,4,100);
    PrintfLinkList(L);
    printf("\n");

    //删除操作
    LinkList_Delete(&L,4);
    PrintfLinkList(L);
    printf("\n");

    //求表长
    printf("%d",GetList_Length(L));
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

强大的RGG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值