链表的基本操作

本文介绍了链表作为数据结构在频繁进行插入和删除操作时的优势。链表由节点组成,每个节点包含数据域和指针域。文章详细阐述了链表的初始化、获取长度、遍历、清空、销毁以及插入(头插法和尾插法)和删除等操作的实现方法。
摘要由CSDN通过智能技术生成
链表的概念:

当一组数据中需要频繁的进行插入、删除操作的时候,链表是首选的数据结构

链表的组成:

链表是由结点组成

结点分为两部分:

1:数据域,保存存储的数据元素

2:指针域,指向下一个结点的地址

结点的创建:
struct Node{
    int data;        //数据域
    struct Node *next; //指针域
};

结点的类型:

  1. 头结点:只有指针域 数据域不存放数据

  1. 首元结点:第一个存放数据的结点,成为首元结点

链表的实现

链表的初始化
typedef struct Node{
    int data;    //数据域
    struct Node * next;    //指针域
}Node,*LinkList;    //Node struct Node 的别名
                    //LinkList  struct Node * 的别名

//链表的初始化
LinkList create(){
    //动态申请空间    head指针指向这个空间
    LinkList head=(Node *)malloc(sizeof(Node));
    if(head==NULL){
        printf("内存分配失败\n");
        return NULL;
    }
    head->next=NULL;    //头结点指针域赋值为 NULL
    return head;        //返回头结点 指针
}
链表的长度获取
//实际传的是头结点地址,但是代表的是一个链表
int getSize(LinkList head){
    //头结点为空
    if(!head){
        printf("空间开辟失败!");
        return 0;
    }
    
    //p 指向首元结点
    Node *p=head->next;
    //LinkList q=head->next;
    
    //计算器
    int count=0;
    while(p!=NULL){
        count++;
        p=p->next;            //指针后移
    }
    //返回链表长度
    return count;
}
链表的遍历
void foreach(LinkList head){
    if(!head){
        printf("空间开辟失败!");
        return;
    }
    LinkList p=head->next;
    while(!p){
        printf("%d",p->data);
        p=p->next;
    }
    
}
链表的清空
void clear(LinkList head){
    if(!head){
        return;
    }
    
    Node *p=head->next;
    
    while(!p){
        //q存放的是p下一个结点地址
        LinkList q=p->next;
        
        //释放p
        free(p);
        
        p=q;
    }
    head->next=NULL
}
链表的销毁
void destroy(LinkList head){
    if(!head){
        return;
    }
    
    clear(head);
    
    free(head);
   
    head = NULL;            //指针设置为 空
}
链表的插入(尾插法)
void insert(LinkList head){
    if(!head){
        return;
    }
    
    int num;
    printf("请输入你要插入的结点数量:\n");
    scanf("%d",&num);
    int i;
    Node *q=head;
    
    for(i=0;i<num;i++){
        LinkList p=(Node *)malloc(sizeof(Node));
        
        printf("请输入数据域的值:");
        
        scanf("%d",&p->data);
          
        q->next=p;
        
        q=q->next;
    }
}
链表的插入(头插法)
void insert(LindList head){
    if(!head){
        return;
    }
    
    int i,num;
    printf("请输入你要插入的结点数量:\n");
    scanf("%d",&num);
    
    for(i=0;i<num;i++){
        Node *p=(Node *)malloc(sizeof(Node));
        
        printf("请输入数据域的值:");
        scanf("%d",&p->data);
        
        p->next=NULL;
        
        //头插法
        p->next = head->next;
        
        head->next=p;
    }
}
链表的删除
//根据元素的值去删除结点
void delete(LinkList head,int value){
    if(head==NULL){
        return;
    }
    Node *p=head;            //p指针指向头结点的
    Node *q;
    while(p->next!=NULL){
        if(p->next->data==value){
            q=p->next;
            p->next=q->next;
            free(q);
        }else{
            p=p->next;
        }
    }
    
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值