数据结构 study 2: 函数指针的使用

"这篇博客介绍了如何在实际项目中使用数据结构解决具体问题,以线性表为例展示了如何动态分配数组存储两组数据La和Lb,并将它们合并成新的组合Lc。通过C语言实现的代码详细解释了插入操作和遍历操作,并提供了合并两个列表的函数Union。在示例中,成功将La={1,2,3,4,5}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构

是用来解决现实生活中或者实际项目中遇到的问题的
那么在实际的项目中,会遇到哪些问题呢?

有两组任意的数据 ,
假设为:La= {1, 2, 3, 4 ,5}, Lb= {2, 4, 6, 8, 10}.
将这两组数据 组合存放到一块。
变成一个新的组合:Lc = {1, 2, 3, 4, 5, 6, 8, 10}.

题目 分析

1,如何存放和表示 La Lb Lc
动态分配的数组或者是链表,先用动态分配的数组实现。

如下数据结构
线性表的动态分配顺序存储结构

 typedef int ElemType;
 typedef struct
 {
   ElemType *elem; /* 存储空间基址 */
   int length; /* 当前长度 */
   int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
 }SqList;

SqList La,Lb;
La= 1 2 3 4 5
Lb= 2 4 6 8 10
new La= 1 2 3 4 5 6 8 10
测试代码:
/* c1.h (程序名) */
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include <sys/io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */

#include<pthread.h> /* exit() */

/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */

typedef int ElemType;

#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */
#define LIST_INCREMENT_NUM 2 /* 线性表存储空间的分配增量 */


typedef struct
{
    ElemType *base_addr ;   //列表的存储位置的基地址
    int list_cnt   ;   //列表中元素的个数   
    int list_size  ;   //列表的容量
}SqList;               // 顺序列表



Status equal(ElemType c1,ElemType c2)
{ /* 判断是否相等的函数,Union()用到 */
  if(c1==c2){
    return TRUE;
  }
  else{
    return FALSE;
  }
}




int init_sqlist(SqList *list ,int length)
{
    list->base_addr = (ElemType *)malloc(sizeof(ElemType)* length);

    list->list_size = 0 ;
    list->list_cnt = 0 ;
    list->list_size = length ;
}


/*
  ----- 插入数据    -----
  从位置0 开始插入
  
*/

Status insert_sqlist(SqList *list, int i , ElemType e)
{
    ElemType *pt;
    ElemType *pt_insert;
    ElemType *pt_tail;

    printf("i = %d, list_size = %d\n", i , list->list_size);
    
    if((i < 0) ||( i > list->list_size)){

        return -1;
    }

    if( list->list_cnt == list->list_size){
        ElemType *newbase ;
        newbase = (ElemType *)realloc(list->base_addr,(list->list_size+LIST_INCREMENT_NUM)*sizeof(ElemType));
        if(!newbase){
            exit(1);
        }

        list->base_addr = newbase;
        list->list_size += LIST_INCREMENT_NUM ;
    }

    pt_insert = list->base_addr + i ;/* 插入位置 */

    pt_tail = list->base_addr + list->list_cnt - 1;/*指向最后一个元素*/

   /*
     从后往前挪动,原本 i位置的数据,也要往后挪动
   */
    
   for(pt= pt_tail;pt >= pt_insert;pt--){

    *(pt+1) = *pt;
   }

   *pt_insert = e ;

   list->list_cnt += 1 ;

   return OK ;
   
}




/*
  ----- 遍历 -----
*/

Status traverse_sqlist(SqList L, void(*print_elem)(ElemType *))
{
    int i ;
    ElemType *p;
    p = L.base_addr;
    for(i=0; i< L.list_cnt;i++){
        
        print_elem(p++);
    }

    printf("\n");

    return OK;
}

void print(ElemType *c)
{
  printf("%d ",*c);
}


int sqlist_length(SqList L)
{
    return L.list_cnt;
}


/* 
  i 从0 开始 
*/

void get_elem(SqList L,int i,ElemType *e)
{ 
  if((i < 0)||( i > L.list_cnt)){
    exit(1);
  }

  *e=*(L.base_addr+i);
  
  return OK;
}




int locate_elem(SqList L, ElemType e, Status(*compare)(ElemType,ElemType))
{
    ElemType *p;

    int i = 0 ;

    p = L.base_addr ;

    while(i<L.list_cnt&&!compare(*p++,e)){

        ++i;
    }

  if(i< L.list_cnt){
    return i;    
  }

  return -1;
}


/*
  ----- 合并 -----
*/

void Union(SqList *La,SqList Lb)
{
    /* 将所有在线性表Lb中但不在La中的数据元素插入到La中 */
    ElemType e;
    int La_len,Lb_len;
    int i;    
    int ret ;

    La_len=sqlist_length(*La);
    Lb_len=sqlist_length(Lb);

    printf("Union La的长度为: %d\n", La_len);
    printf("Union Lb的长度为: %d\n", Lb_len);
    
    for(i=0;i<Lb_len;i++)
    {
      get_elem(Lb,i,&e); /* 取Lb中第i个数据元素赋给e */
      
      ret = locate_elem(*La,e,equal);

      printf("%d : %d : %d\n", i, e, ret);
      
      if( ret < 0) /* La中不存在和e相同的元素,则插入之 */
      {  
        printf("e = %d, La_len = %d\n", e, La_len);
        
        insert_sqlist(La,La_len,e);
        La_len++ ;
      }
      
    }

  
}



int main()
{
    int elem_num_a =0;
    int elem_num_b =0;

    int i ;
    SqList La ;
    SqList Lb ;
    ElemType data ;
    
    printf("请输入列表A中元素的个数:\n");

    scanf("%d",&elem_num_a);

    printf("elem_num_a = %d\n", elem_num_a);

    init_sqlist(&La, elem_num_a);

    printf("请逐个输入列表A中元素的内容:\n");
    for(i=0;i< elem_num_a ; i++){
        
        scanf("%d",&data);
        insert_sqlist(&La,i,data);        
    }  

    printf("列表A中元素的内容为:\n");
    
    traverse_sqlist(La,print);


    /*--------------------------------*/

    printf("请输入列表B中元素的个数:\n");

    scanf("%d",&elem_num_b);

    printf("elem_num_b = %d\n", elem_num_b);

    init_sqlist(&Lb, elem_num_b);

    printf("请逐个输入列表B中元素的内容:\n");
    for(i=0;i< elem_num_b ; i++){
        
        scanf("%d",&data);
        insert_sqlist(&Lb,i,data);    

    }  

    printf("列表B中元素的内容为:\n");
    
    traverse_sqlist(Lb,print); 

   /*---------------合并-----------------*/   
   Union(&La,Lb);

   printf("合并后,列表A中元素的内容为:\n");
    
   traverse_sqlist(La,print);
  
}

运行log:
请输入列表A中元素的个数:
3
elem_num_a = 3
请逐个输入列表A中元素的内容:
1
i = 0, list_size = 3
2
i = 1, list_size = 3
3
i = 2, list_size = 3
列表A中元素的内容为:
1 2 3
请输入列表B中元素的个数:
3
elem_num_b = 3
请逐个输入列表B中元素的内容:
5
i = 0, list_size = 3
6
i = 1, list_size = 3
7
i = 2, list_size = 3
列表B中元素的内容为:
5 6 7
Union La的长度为: 3
Union Lb的长度为: 3
0 : 5 : -1
e = 5, La_len = 3
i = 3, list_size = 3
1 : 6 : -1
e = 6, La_len = 4
i = 4, list_size = 5
2 : 7 : -1
e = 7, La_len = 5
i = 5, list_size = 5
合并后,列表A中元素的内容为:
1 2 3 5 6 7

欢迎交流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值