菜鸟学习历程【11】数据结构

数据结构
一、线性表

1.定义:定义n个数据元素的有限序列,记作(a1, a2, …, an),ai 是表中数据元素,n 是线性表的长度。

2.特点:
     直接前驱:除第一个元素外,其他每一个元素有且仅有一个前驱;
     直接后继:除最后一个元素外,其他每一个元素有且仅有一个后继。    

二、顺序表

1.定义:将线性表中的元素相继存放在一个连续的存储空间中。         

2.特点:可利用一维数组描述存储结构、线性表的顺序存储方式、顺序访问, 可以随机存取 。

下面介绍一个顺序表的程序:

    基本功能:元素的插入、定位、遍历、删除、顺序表的判空;

    首先是头文件:Sequence.h
#ifndef _SEQUENCE_H_             // #ifndef xxxxxxxx ....  #endif  是头文件的固定格式
#define _SEQUENCE_H_
#define MAXSIZE      10
#define FAILURE      100000
#define SUCCESS      100001 
#define FAUSE        100002
#define TRUE         100003
typedef int ElemType;

struct sequence 
{
    ElemType *data;
    int size;
    int length;
};

typedef struct sequence SeList;

int InitList(SeList *s);        //初始化函数
int EmptyList(SeList s);        //顺序表判空函数
int LengthList(SeList s);       //顺序表长度求取函数
int InsertList(SeList *s, int i, ElemType e);      //指定位置插入元素函数
int LocateElem(SeList s, int e, int (*compare)(ElemType, ElemType));   //定位函数
int GetElem(SeList s, int p);   //获取元素内容函数
int ListTraverse(SeList s, void(*compare)(ElemType));    //遍历函数
int DeleteList(SeList *s, int pos);    //删除函数

#endif
      
       main.c

int equal(ElemType a, ElemType b)   //equal 与 large 为函数指针,后面会调用到
{
    return (a == b) ? TRUE : FAUSE;
}

int large(ElemType a, ElemType b)
{
    return (a <= b) ? TRUE : FAUSE;
}

void visit(ElemType e)                  //visit 与 add  为函数指针,后面会调用
{
    printf("%d ",e);
}

void add(ElemType e)
{
    printf("%d ", e + 1);
}
int main()
{
    SeList Slist;                     //定义一个SeList 的变量
    int ret, i, place, val, pos, j;  //ret 变量用来接各个函数的返回值
    int a[10]={0};

//********初始化部分*************
    ret = InitList(&Slist);           //初始化用使用到地址传递,值传递分配的内存并不会保留
	
    if(ret == SUCCESS)                //初始化判断
    {
        printf("Init SUCCESS\n");
    }
    else
        printf("Init FAULIE\n");
     for(i = 0;i < MAXSIZE;i++)      //使用for循环调用Insert函数插入0~9十个数
    {
        ret = InsertList(&Slist, i, i + 1);
        if(SUCCESS == ret)
           printf("Insert %d Success\n", i);
        else
           printf("Insert %d Failure\n", i);
      }

//***********判断是否为空顺序表*********
	ret = EmptyList(Slist);
	if(TRUE == ret)
	{
		printf("List is empty\n");
	}
	else
	{
		printf("List is't empty\n");
	}

	printf("Length:%d\n", LengthList(Slist));  //调用length求取函数,输出长度

//*************获取指定位置元素***********
	place = 3;                                //指定获取的位置为3
	ret = GetElem(Slist, place);
	if(ret == FAUSE)                          //提示获取失败、获取成功打印
	{
		printf("Elem %d is not found\n", place);
	}
	else
	{
		printf("Elem %d  is %d\n", place, ret);
	}

//************遍历顺序表,实现函数功能并打印**********
	ret = ListTraverse(Slist, add);          //add为函数指针,实现加一操作再输出
	if(ret == SUCCESS)
	{
		printf("SUCCESS\n");
	}
	else
	{
		printf("Failure\n");
	}

//*********返回顺序表中data内容满足函数要求的下标**********
	val = 4;                                   
	ret = LocateList(Slist, val, equal);       //设定值为4,返回满足equal函数要求的元素下标
	if(ret == FAUSE)
	{
		printf("NOT FOUND\n");
	}
	else
	{
		printf("%d is %dth\n", val, ret);
	}

//*************获取值,按顺序插入顺序表中***********
//	for(i = 0;i < 10;i++)                     //这两部分要与上面分开,是单独加的功能
//	{                                         //终端获取指定插入值,并按从小到大排列
//         	printf("Please input a number:\n");
//		scanf("%d", &a[i]);
//		ret = LocateList(Slist, a[i], large);
//		InsertList(&Slist, ret, a[i]);	
//	}
//	ListTraverse(Slist, visit);
//	printf("\n");

//******从终端获取指定删除的位置,实现删除的功能********
//      printf("Please input the position:\n");
//      scanf("%d", &pos);
//      ret = DeleteList(&Slist, pos);
//      j = 0;
//      if(ret == FAUSE)
//     {
//         printf("Unkown!\n");
//      }
//      while(Slist.length != 0)
//     {
//         printf("%d ", Slist.data[j]);
//         Slist.length--;
//         j++;
//      }
//      printf("\n");
        return 0;
}

接口部分:Sequence.c

#include <stdio.h>
#include <stdlib.h>
#include "Sequence.h"

int InitList(SeList *s)
{                                     //为data分配10个ElemType单位的内存,存放十个数据
	s->data = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
	if(s->data == NULL)           //分配内存检查
	{
		return FAILURE;
	}
	s->size = MAXSIZE;
	s->length = 0;

	return SUCCESS;
}

int InsertList(SeList *s, int i, ElemType e)
{
	int k;                               //判断输入的插入位置是否合法
	if((i < 0 || i >= MAXSIZE) || s->length > MAXSIZE)
	{
		return FAILURE;
	}
	
	for(k = 0;k < s->length - i;k++ )   //将插入位置之后的所有元素依次向后挪一位
	{
		s->data[s->length - k] = s->data[s->length - k -1];
	}
	s->data[i] = e;                    //挪位完成后,插入数据
	s->length++;                       //将表的长度加1,size是表的容量,即最大长度

	return SUCCESS;
}

int EmptyList(SeList s)                   //判断表的长度是否为0,0即空表
{
	return (s.length == 0) ? TRUE : FAUSE;
}

int LengthList(SeList s)
{
	return s.length;
}

int GetElem(SeList s, int p)
{
	int ret = 0;
	if(p < 0 || p >= 10)    //判断输入的获取位置是否合法
	{
	    return FAUSE;
	}
	ret = s.data[p];    
	return ret;
	
}

int ListTraverse(SeList s,void (*look)(ElemType))  //遍历满足函数指针要求的元素
{
	int i;
	for(i = 0;i < s.length;i++)
	{
		look(s.data[i]);
	}
	return SUCCESS;
}

int LocateList(SeList s, int e,int (*compare)(ElemType, ElemType))
{
	int i = 0;

	for(i = 0;i < s.length;i++)
	{
		if(compare(e, s.data[i]) == TRUE)
			break;
	}
	return i;

}

int DeleteList(SeList *s, int pos)
{
	int i;
	if(pos < 0 || pos > 10)
	{
		return FAUSE;
	}
	else
	{
		for(i = pos;i < s->length;i++)
		{
			s->data[i] = s->data[i+1];
		}
		s->length--;
		return SUCCESS;
	}
}






   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值