p71 数据结构介绍
老师推荐书籍:
《算法导论》
《数据结构》严蔚敏
《编程之美》
p72 课程介绍
(课程概览)
p73 顺序存储线性表实例1
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "sqlist.h"
int main()
{
//链表的两种生成方式
//1.函数返回值返回指针
//2.利用二级指针传参,在函数体内将二级指针对应的一级目标进行完成
sqlist* list;
datatype arr[]={1,2,3,4,5};
sqlist* list2;
datatype arr2[]={4,5,8,9,10};
//list = sqlist_create();
sqlist_create1(&list);
sqlist_create1(&list2);
if(list==NULL)
{
fprintf(stderr,"sqlist_create() failed!\n");
exit(1);
}
for(int i=0;i<sizeof(arr)/sizeof(datatype);i++)
{
int err = sqlist_insert(list,0,&arr[i]);
if(err!=0)
{
if(err=-1)
fprintf(stderr,"This list is full!\n");
else if(err=-2)
fprintf(stderr,"The postion you want to insert is wrong!\n");
else
fprintf(stderr,"ERROR!\n");
exit(1);
}
//printf("插入操作执行完毕!");
}
if(list2==NULL)
{
fprintf(stderr,"sqlist_create() failed!\n");
exit(1);
}
for(int i=0;i<sizeof(arr2)/sizeof(datatype);i++)
{
int err = sqlist_insert(list2,0,&arr2[i]);
if(err!=0)
{
if(err=-1)
fprintf(stderr,"This list is full!\n");
else if(err=-2)
fprintf(stderr,"The postion you want to insert is wrong!\n");
else
fprintf(stderr,"ERROR!\n");
exit(1);
}
//printf("插入操作执行完毕!");
}
//sqlist_delete(list,4);
//sqlist_display(list);
datatype a =4;
datatype* data =&a;
int find = sqlist_find(list,data);
printf("查找元素3的索引为:%d\n",find);//1
sqlist_union(list,list2);
printf("合并后的结果:\n");
sqlist_display(list);
sqlist_destroy(list);
sqlist_destroy(list2);
exit(0);
}
//sqlist.c
#include <stdio.h>
#include <stdlib.h>
#include "sqlist.h"
sqlist* sqlist_create()
{
sqlist* me;
me= malloc(sizeof(*me));
if(me==NULL)
return NULL;
me->last=-1;
return me;
}
void sqlist_create1(sqlist** ptr)
{
*ptr=malloc(sizeof(**ptr));
//注意:sizeof(**ptr) 实际上计算的是 sqlist 结构体的大小,正是我们想要分配的内存空间大小
//malloc 是通过 sizeof(**ptr)(实际上等于 sizeof(sqlist))来知道要分配多大的内存空间的。这个大小是在编译时确定的,与 ptr 指向的具体内容无关。
if(*ptr==NULL)
return;
//***
(*ptr)->last=-1;
}
int sqlist_insert(sqlist* me,int i,datatype* data)
{
//异常1:线性表已满
if(me->last == DATASIZE-1)
return -1;
//异常2:插入位置不合规
if(i<0||i>me->last+1)
return -2;
for(int j=me->last;j>=i;j--)
me->data[j+1]=me->data[j];
me->data[i]=*data;
me->last++;
return 0;
}
void sqlist_display(sqlist* me)
{
if(me->last ==-1)
{
printf("打印失败:空的线性表!");
return ;//当前线性表为空时直接返回。
}
for(int i=0;i<=me->last;i++)
{
printf("%d ",me->data[i]);
}
printf("\n");
return;
}
int sqlist_delete(sqlist* me,int i){
if(me->last ==-1)
{
printf("删除失败:空的线性表!");
return -1;
}
if(i<0||i>me->last+1)
{
printf("删除失败:删除索引不合规!");
return -2;
}
while(i<me->last)
{
me->data[i]=me->data[i+1];
i++;
}
me->last--;
return 0;
}
int sqlist_find(sqlist * me,datatype* data)
{
if(me->last ==-1)
{
printf("查找失败:空的线性表!");
return -1;
}
for(int i=0;i<=me->last;i++)
{
if(*data == me->data[i])
return i;
}
return -1;
}
int sqlist_isempty(sqlist* me)
{
if(me->last==-1)
return 0;
else
return -1;
}
int sqlist_setempty(sqlist* me)
{
me->last=-1;
return 0;
}
int sqlist_getnum(sqlist* me)
{
return me->last+1;
}
int sqlist_union(sqlist* list1,sqlist* list2)
{
for(int i=0;i<=list2->last;i++)
{
if(sqlist_find(list1,&list2->data[i])==-1)
sqlist_insert(list1,list1->last+1,&list2->data[i]);
}
return 0;
}
int sqlist_destroy(sqlist* me)
{
free(me);
return 0;
}
//sqlist.h
#ifndef SQLIST_H_
#define SQLIST_H_
#define DATASIZE 1024
typedef int datatype;
typedef struct node_st
{
datatype data[DATASIZE];
int last;
}sqlist;
sqlist* sqlist_create();
void sqlist_create1(sqlist**);
int sqlist_insert(sqlist*,int i,datatype*);
int sqlist_delete(sqlist*,int i);
int sqlist_find(sqlist*,datatype*);
int sqlist_isempty(sqlist*);
int sqlist_setempty(sqlist*);
int sqlist_getnum(sqlist*);
void sqlist_display(sqlist*);
int sqlist_union(sqlist*,sqlist*);
int sqlist_destroy(sqlist*);
#endif