李慧芹_数据结构p71-p122

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值