链表小白入门

数据结构
       逻辑关系:线性关系,树状关系,图形关系,集合关系
       存储关系:顺序存储,链式存储。
       算法:广义:数据结构算法
             狭义:增删改查
--------------------------------------------        
线性表(逻辑关系里的线性关系)
             
1,顺序表
        概念:只有一个前驱结点和一个后驱结点 ---- 1对1关系
             数据紧挨保存,不能间断,数据保存在同一片空间中     
        保存:利用堆去保存数据+最大下标遍历         
              struct {
                    int *p;        //保存堆的地址
                    int len;    //有效数据的下标 
                    int size;    //数组元素的总个数    
                }     
    顺序表建立
seqlist.h
           #ifndef __SEQLIST_H
            #define __SEQLIST_H

            #include <stdio.h>
            #include <stdlib.h>
            #define SIZE 5
            typedef struct{                    //关键字  typedef 类型取别名  
                int *p;            保存堆的地址,用于保存数据
                int len;        //有效数据的下标 
                int size;        //数组元素的总个数    
    
            }seq_t;

extern void seq_init(seq_t *ps);
extern void seq_add(int data,seq_t *ps);
extern void display(seq_t *ps);


#endif

seqlist.c

----开辟堆空间的函数
void seq_init(seq_t *ps){//参数:需要把堆空间的返回,保存在结构体的某个成员中,所以需要传入结构体

    ps->size=SIZE;//确保你堆空间的大小//数据的个数的
    ps->p=(int *)malloc(ps->size * sizeof(int));//sizeof(int) 4个字节
    //将malloc开辟的空间返回时强转成int *类型,和p同类型接收
    if(ps->p==NULL){
        printf("迎面走来得你让我蠢蠢欲动\n");
        return;
    }
    ps->len=-1;//刚申请下来的空间,没有数据,所以不需要下标
    
}

//添加数据---->要将数据添加入结构体的ps->p中   //分析参数: 数据:data    ps->p:ps
void seq_add(int data,seq_t *ps){
    //问题:我们当前的ps->p 只声明了20个字节,只能存5个整数 如果我们的数据超过5个呢? 
    //判断是否存满数据
    //制作一个中间变量,暂时保留某些操作
    int *temp;
    if(ps->len==ps->size-1){
        //扩容操作 
        ps->size +=SIZE;//ps->size=ps->size+SIZE 
        temp=(int *)realloc(ps->p,ps->size * sizeof(int));//重新调整堆空间的
        if(temp==NULL){
            printf("这种感觉我从未有过\n");
            return;
        }
        ps->p=temp;
        printf("扩容成功\n");
        
    }
    
    ps->len++;//下标移动
    ps->p[ps->len]=data;//根据下标移动查找赋值空间    
}

//遍历操作
void display(seq_t *ps)
{
    printf("遍历结果是:");
    int i;//for循环的依据
    for(i=0;i<=ps->len;i++){
        printf("%d ",ps->p[i]);
    }
    printf("\n");
    
    
}

#include "seqlist.h"

int main(){
    //1>增删改查? 
    //前提:开辟堆空间
    seq_t seq;
    seq_init(&seq);//函数使用:第一准则:看参  第二准则:看返
    printf("水一方沐足店欢迎您,尊贵tonly VIP\n");
    
    //2>增操作
    int data;//用于保存输入的数据
    int temp;
    while(1){
            temp=scanf("%d",&data);
            if(temp==0){
                break;
            }
            seq_add(data,&seq);
            display(&seq);
    }
    return 0;
}

链表
     单向链表 
            1>概念: 
                只有一个前驱结点和一个后驱结点,
                每个节点都保存下一个节点的地址,拥有一个没有数据域的头结点 
            PS: 物理空间上不连续,代码逻辑上连续 
     结构体形状: 
            前驱结点和一个后驱结点,节点都保存下一个节点的地址
            struct xx{
                int data;        //数据域
                struct xx *next;//下一个结点的地址
            }
            
        3>PS: 
                link.h    头文件以及函数声明 
                link.c    函数制作 
                main.c    函数调用以及代码逻辑    
     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值