重点 单链表的创建,插入,删除

一. 数据结构三大要素:

  • 1.逻辑结构

    • ①线性:一对一

    • ②非线性:一对多,多对多

       2.存储结构

                ①顺序存储 :数据元素在内存中是一个挨一个的,连续存储

                ②链式存储 :数据元素在内存中是不连续存储的

                ③索引存储

        3.算术

                主要对数据的操作

 二.顺序表

                     逻辑结构:线性

                     存储结构:顺序存储

                     操作:在任意位置操作删除表

  三,单链表

                     逻辑结构:线性

                     存储结构:链式存储

                     操作:在任意位置操作删除表

main.c

#include "link_list.c"
int main(int argc, char const *argv[])
{
    link_list_t *H=create_list();
    if(NULL==H){
        return -1;
    }
    data_t i;
    while(1){
        scanf("%d",&i);
        if(-1==i){
            break;
        }
       head_insert(H,i);//调用头部插入
     
    }
    show_list(H);
   // pos_insert(H,1,10);
   // pos_delete(H,1);
   // change_data(H,10);
    overturn_list(H);
    show_list(H);
    free_list(&H);
    //show_list(H);
    return 0;
}

 link_list.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "link_list.h"
//申请空间
link_list_t *create_list(void){
    link_list_t *L=(link_list_t *)malloc(sizeof(link_list_t));
   //健壮性判断
    if(NULL==L){
        puts("创建链表失败");
        return NULL;
    }

//初始化空间
    L->data=-1;
    L->next=NULL;
//返回首地址
    return L;
}
int head_insert(link_list_t *H,data_t value){
    if(NULL==H){
        puts("传入标参数非法");
        return -1;
    }
    //申请数据节点
    link_list_t *New=create_list();
    if(NULL==New){
        puts("传入标参数非法");
        return -1;
    }
    //初始化数据节点
    New->data =value;
    New->next=NULL;
    //头部插入操作
    New->next=H->next;
    H->next=New;
    //完成返回
    return 0;
}
int show_list(link_list_t *H){
    if(NULL==H){
        puts("传入标参数非法");
        return -1;
    }
    if(NULL==H->next){
        puts("为空表");
        return -1;
    }
    link_list_t *q;
    q=H->next;
    while(q!=NULL){
        printf("%d ",q->data);
        q=q->next;

    }
    puts("");
    return 0;
}
//尾部插入
int tail_insert(link_list_t *H,data_t value){
     if(NULL==H){
        puts("传入标参数非法");
        return -1;
    }
    //创建新节点
    link_list_t *New=create_list();
    if(NULL==New){
        puts("创建新节点失败");
        return -1;
    }
    //初始化新节点
    New->data=value;
    New->next=NULL;
    //遍历至链表尾部节点
    link_list_t *q=H;
    while(q->next!=NULL){
        q=q->next;
    }
    q->next=New;
    return 0;
}
int pos_insert(link_list_t *H,unsigned int pos,data_t value){
    if(NULL==H){
        puts("传入表参数非法");
        return -1;
    }
    link_list_t *New=create_list();
    if (NULL==New)
    {
       puts("创建新节点失败");
       return -1;
    }
    New->data=value;
    New->next=NULL;
    link_list_t *q=H;
    int i;
    for(i=0;i<pos;i++){
        q=q->next;
        if(q==NULL){
            puts("传入位置非法");
            return -1;
        } 
    }
    New->next=q->next;
    q->next=New;
    return 0;
}
int pos_delete(link_list_t *H,unsigned int pos){
    if(NULL==H){
        printf("传入参数非法");
        return -1;
    }
    link_list_t *q=H;
    link_list_t *p;
    int i;
    for(i=0;i<pos;i++){
         q=q->next;
          if(q==NULL){
            puts("传入位置非法");
            return -1;
        }
    } 
     p=q->next;
     q->next=p->next;
     free(p);
     p=NULL;
     return 0;
}
int find_data(link_list_t *H,data_t value){
    if(NULL==H){
        puts("传入数据非法");
        return -1;
    }
    if(NULL==H->next){
        puts("为空表");
        return -1;
    }
    link_list_t *q=H->next;
    while(q!=NULL){
        if(value==q->data){
            puts("你查找的数据存在");
            return q->data;

        }
        q=q->next;
    }
     puts("你查找的数据不存在");
     return -1;
}
int change_data(link_list_t *H,data_t value){
     if(NULL==H){
        puts("传入数据非法");
        return -1;
    }
    if(NULL==H->next){
        puts("为空表");
        return -1;
    }
    link_list_t *q=H->next;
    while(q!=NULL){
        if(value==q->data){
            printf("已查到选择要修改的数据");
            scanf("%d",&(q->data));
             printf("修改完成");
             return 0;
        }
        q=q->next;
    }
    puts("你查找的数据不存在");
     return -1;
}
int overturn_list(link_list_t *H){
    if(NULL==H){
        puts("传入非法");
        return -1;
    }
    if(NULL==H->next||NULL==H->next->next){
        puts("为空表或只有一个元素");
        return -1;
    }
    link_list_t *q=H->next->next;
    H->next->next=NULL;
    link_list_t *p;
    while(q!=NULL){
        p=q;
        q=p->next;
        p->next=H->next;
        H->next=p;
    }
    puts("链表翻转完成");
    return 0;
}
int free_list(link_list_t **H){
    if(NULL==*H||NULL==H){
        puts("传入表参数非法");
        return -1;
    }
    link_list_t *q=*H;
    while(NULL!=q){
        q=(*H)->next;
        printf("节点%d将被释放\n",(*H)->data);
        free(*H);
        *H=q;
    }
 return 0; 
}

 link_list.h

#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
typedef int data_t;
typedef struct node{
    data_t data;
    struct node *next;  
}link_list_t;
//创建链表
link_list_t *create_list(void);
//头部插入
int head_insert(link_list_t *H,data_t value);
//尾部插入
int tail_insert(link_list_t *H,data_t value);
//遍历链表
int show_list(link_list_t *H);
//任意位置插入
int pos_insert(link_list_t *H,unsigned int pos,data_t value);
//删除任意位置
int pos_delete(link_list_t *H,unsigned int pos);
//查找节点
int find_data(link_list_t *H,data_t value);
//修改节点
int change_data(link_list_t *H,data_t value);
//链表翻转
int overturn_list(link_list_t *H);
//链表释放
int free_list(link_list_t **H);
#endif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值