单链表的十大操作(C语言版)基础操作大全

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node *next;
}Node,*LinkList;
void Initiate(Node *L)  //初始化单链表,创建一个头结点
{
    L->next=NULL;
    printf("-------创建成功");
}
int Length(Node *L)  //求表长
{
    Node *p=L;int i=-1;  //-1表示减去了头结点
    while(p!=NULL)
    {
        p=p->next;
        i++;
    }
    return i;
}
void Output(Node *L)  //输出整个单链表
{
    printf("\n开始输出");
    int cout=0;
    if(L->next!=NULL) //判断是否为头结点
    {
        for(Node *p=L->next;p!=NULL;p=p->next)
        {
            printf("\n第%d个数据是:%d",++cout,p->data);
        }
        printf("\n输出结束");
        return 1;
    }
    printf("\n这是头结点");
}
int Loc_GetElem(Node *L,int i) //按位查找返回值
{
    Node *p=L;int j=0;
    if(i<1||i>Length(L))
        return -1;
    for(;j<i;p=p->next)
        ++j;
        printf("\n查找结束");
    return p->data;
}
int Val_GetElem(Node *L,int data)  //按值查找返回位置
{
    Node *p;int i=0;
    for(p=L;p->data!=data&&p!=NULL;p=p->next)
        i++;
    if(p==NULL)
        return -1;
    return i;
}
LinkList Head_Insert(Node *L)//头插法插入一个节点
{
    Node *s;int data;
    printf("\n请输入要插入的数,666为结束:");
    scanf("%d",&data);   //(这里默认输入的数合法,没有作检查,不要乱输)
    while(data!=666)
    {
        s=(Node*)malloc(sizeof(Node));
        s->data=data;
        s->next=L->next;
        L->next=s;
        printf("请输入要插入的数,666为结束:");
        scanf("%d",&data);
    }
    printf("插入成功");
    return L;
}
LinkList Tail_Insert(Node *L)  //尾插法
{
    Node *s;int data;
    printf("\n请输入要插入的数,666为结束:");
    scanf("%d",&data);
    while(data!=666)
    {
        Node *p=L;
        for(;p->next!=NULL;) //将p指针指向单链表的最后一个节点
            p=p->next;
        s=(Node *)malloc(sizeof(Node));
        s->data=data;
        s->next=NULL;
        p->next=s;
        printf("\n请输入要插入的数,666为结束:");
        scanf("%d",&data);
    }
    return L;
}
LinkList Loc_Insert(Node *L,Node *d,int i)  //按位置插入
{
    Node *p;int loc=1;
    if(i<1)
    {
        printf("输入的位置有误");
        return -1;
    }
    for(p=L;loc<i&&p!=NULL;p=p->next)  //这里头结点不算作数据节点,当loc数值与所需位置相等时,
        loc++;                        //p指针指向第i-1的位置,直接插入p后即可
    if(p==NULL)
    {
     printf("输入位置非法");
     return -2;
    }
    d->next=p->next;
    p->next=d;
    printf("\n-----插入第%d个位置成功",i);
    return L;
}
LinkList Del_Val(Node *L,int d)  //按值删除
{
    Node *p,*q;
    for(p=L;p->next->data!=d&&p!=NULL;)
        p=p->next;
    if(p==NULL)
        return -1;
    q=p->next;  //q就是要删除的数据
    p->next=q->next;
    free(q);
    return L;
}
void Del_List(Node *L)  //删除链表
{
    Node *p;
    for(;L->next!=NULL;L=p)//p指向L的下一个节点
    {
        p=L->next;
        free(L);
    }
    //free(L); //删除头结点
    L=NULL;
    printf("\n-------删除成功");
}
int main()
{
    Node *L;
    L=(LinkList)malloc(sizeof(Node));  //这里申请空间如果放在初始化的函数里则执行完初始化函数后空间将不存在,所以要放在主函数里
    Initiate(L);
    L=Head_Insert(L);
    Output(L);
    Node *d;
    d=(LinkList)malloc(sizeof(Node));
    d->data=9;
    d->next=NULL;
    L=Loc_Insert(L,d,1);
    Output(L);
    Tail_Insert(L);
    Output(L);
    printf("\n表长为: %d",Length(L));
    printf("\n按位查找数据为: %d",Loc_GetElem(L,2));
    printf("\n按值查找位数为: %d",Val_GetElem(L,2));
    L=Del_Val(L,2);
    printf("\n删除后单链表为:");
    Output(L);
    Del_List(L);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值