C语言数据结构第二章—— 静态链表

数据结构第二章—— 静态链表

get 到的东西:

在很多时候需要根据此时的输入来控制上一个位置的参数
在输入的时候,读到-1结束,此时要让上一个数组的cur指向0,可以

  1. 多用一个temp存着上一个数组的下标,然后 head[temp].cur = 0;
  2. 先判断这个数有没有结束,再让data_cur进入下一个数组位置head[data_cur].cur

实现流程

  1. 定义节点,包括数据和游标(下一个数据所在的数组位置)
typedef struct static_node{
    int data;
    int cur;
}Static_node;
  1. 用这种结构类型构建一个数组,并初始化
 Static_node head[Size];
    head[0].cur = Real_Size;
    head[Real_Size-1] = 0;
  • 先设置空表,最后一个元素的cur指向0
    设计出来的数组图示
     for ( i =0; i<Size-1; i++)
    {
        head[i].cur = i+1;
        head[Size-1].cur = 0;
    }

  • 在数据插入时,会怎样呢?
    在数据插入时的数组内部设计结构
    静态列表有几个特点:
    1. 数组的第一位【0】 用来存放备用列表的首位,一般是数据最后一位的下一个位置
    2. 数据的最后一位的cur指向数组首位【0】
    3. 组空间的最后一位…感觉指啥都行啊,那就让它指着数组头吧,然后当数据的cur为0的时候报数据满了
  1. 增加和删除
    增加删除都一样,读入一下数据,把几个参数改一下,把可能出现的状况都想一下,然后把逻辑理一下就好了。不过感觉先写一下伪代码会舒服点,不然会漏东西。
    就是写逻辑+写变化的参数

  2. 转移函数
    数组的话就是传数组的名,接收端接受数组名的指针,数组照用
    常数要改的话就穿地址,接收端收常数指针,再重新定义一遍常数等于指针的值,中间一样,在最后再把常数的值赋予到指针上,传回主函数
    结构体也一样,可看做int,float的另一种形式
    把常数传进函数的时候记得重新创个常数,把指针的值赋到常数上

C语言代码——实现部分操作

// 2020/2/12 在这里的haead,data_number和cur没有写到一个列表里,
// 造成了多次引用,不方便,之后就全写一起了
#include <stdio.h>
#include <stdlib.h>

#define Size 100
#define Real_Size 7;
typedef struct static_node{
    int data;
    int cur;
}Static_node;

void init_head( Static_node *head );
void add( Static_node *head, int *pdata_number);
void print(Static_node *head, int data_number, int first_cur );
void Insert( Static_node *head, int *pdata_number, int *pfirst_cur);
void Delete( Static_node *head, int *pdata_number, int *pfirst_cur);

int main()
{
    int data_number = 0, first_cur = 1;
    Static_node head[Size] ;
    init_head(head);
    add( head, &data_number );
    print( head, data_number, first_cur );
    Insert( head, &data_number, &first_cur);
    print( head, data_number, first_cur );
    Delete( head, &data_number, &first_cur);
    print( head, data_number, first_cur );
    return 0;
}

void init_head( Static_node *head )
{
    int i;
    for ( i =0; i<Size-1; i++)
    {
        head[i].cur = i+1;
        head[Size-1].cur = 0;
    }
}

void add(Static_node *head,int *pdata_number)
{
    int number, data_cur = 1, data_number = 0, temp = 0;
    do {
            scanf("%d", &number);
            if( number != -1){
                temp = data_cur;
                head[data_cur].data = number;
                data_cur = head[data_cur].cur;
                data_number++;
            }
            else {
               head[temp].cur = 0;
            }
        }while(number != -1);
    head[0].cur = data_number + 1;
    *pdata_number = data_number;
}

void print(Static_node *head, int data_number, int first_cur )
{
    // 输出一遍静态链表,需要 data_number, head数组
    int data_cur = first_cur;
    printf("数据共有%d个\t", data_number);
    while ( data_number != 0 ){
        printf("%d\t", head[data_cur].data);
        if( head[data_cur].cur == 0) break;
        data_cur = head[data_cur].cur;
    }
}

void Insert( Static_node *head, int *pdata_number, int *pfirst_cur)
{
        // 再写一个插入链表的
    int insert_number = 0, insert_location = 0, i ;
    int data_number = *pdata_number;
    int first_cur = *pfirst_cur;
    int data_cur = first_cur;
    int before_cur = 0;
    printf("输入插入数据的位置和大小,格式为:4 12\n");
    scanf("%d %d", &insert_location, &insert_number);
    for( i = 1; ; i++ ) {
        if( insert_location==i ){
                if(insert_location == 1) { first_cur = data_number + 1;  }
                if( before_cur ) { head[before_cur].cur = data_number + 1; }
                head[data_number + 1].cur = data_cur ;
                head[data_number + 1].data = insert_number ;
                data_number ++;
                break;
        }
        before_cur = data_cur;
        data_cur = head[data_cur].cur;
    }
    *pdata_number = data_cur;
    *pfirst_cur = first_cur;
    printf("增加完毕\n");
}

void Delete( Static_node *head, int *pdata_number, int *pfirst_cur)
{
        //写一个删除的
    int data_number = *pdata_number;
    int first_cur = *pfirst_cur;
    int  delete_location = 0, i, before_cur ;
    int data_cur = first_cur;
    before_cur = 0;
    printf("输入删除数据的位置,格式为:4\n");
    scanf("%d", &delete_location);
    for( i = 1; ; i++ ) {
    if( delete_location == i ){
            if(delete_location == 1) { first_cur = head[data_cur].cur ;  }
            if( before_cur ) { head[before_cur].cur = head[data_cur].cur; }
            data_number --;
            break;
    }
    before_cur = data_cur;
    data_cur = head[data_cur].cur;
}
    *pdata_number = data_cur;
    *pfirst_cur = first_cur;
    printf("删除完毕");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值