数据结构
是用来解决现实生活中或者实际项目中遇到的问题的
那么在实际的项目中,会遇到哪些问题呢?
有两组任意的数据 ,
假设为: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