数据结构的课程安排
1. 顺序表
2. 链表
3. 栈、队列
4. 树、图
5. 算法
6. 项目
数据结构培养的内容
1. 习惯: 画图–>伪代码–>代码–>运行测试
2. 思维: 逻辑思维 编程思想
3. 能力: 封装接口 调用接口
线性结构
如果当前结点有前驱,那么,它的前驱有且仅有一个。
如果当前结点有后继,那么,它的后继有且仅有一个。
例:数组中有五个元素,现在找到了下标为2的那个元素
前驱: 下标为2-1
后继: 下标为2+1
包含:顺序结构和链式结构
顺序表
特点 *****
地址连续 大小固定
除最前面的元素,其它元素都有前驱。
除最后面的元素,其它元素都有后继。
插入和删除的时候,需要移动元素,不方便。
访问方便。
定义一个数据类型来描述顺序表
struct student
{
char name[SIZE];
int age;
int score[20];
};
typedef struct student data_t;
struct list
{
data_t data[SIZE];
int count; //计数器
};
或者
struct list
{
data_t * pData;
int len; //连续空间的大小
int count; //计数器
};
顺序表的操作
创建顺序表
插入数据到顺序表
显示
修改
删除
查询
判断表空
判断表满
销毁顺序表
int main()
{
//创建顺序表
???? = createList(???);
//存放学生信息到顺序表中 增加
//显示
//删除
//修改
//查询
//销毁顺序表
return 0;
}
补充
内存分段:
栈段: 局部变量、参数
堆段: 动态申请malloc/calloc/realloc和释放free的内存
数据段: 全局变量、静态变量、常量
代码段: 程序
void test( int * p )
{
* p = 90;
}
int add(int a, int b)
{
return a + b;
}
int main()
{
int num = 0;
test(&num); //传出参数
printf("num=%d\r\n", num);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
/*
函数名:createList
函数功能:创建线性表
函数参数:无
函数返回值:成功时,返回线性表首地址;失败时,返回NULL。
*/
LIST * createList( )
{
LIST * pList = NULL;
pList = ( LIST * )malloc( sizeof(LIST) );
if ( NULL != pList )
{
memset( pList, 0, sizeof(LIST) );
}
return pList;
}
/*
函数名:destroyList
函数功能:销毁线性表
函数参数:LIST * pList : 线性表首地址
函数返回值:无
*/
void destroyList( LIST * pList )
{
if ( NULL == pList )
{
return ;
}
free(pList);
pList = NULL;
}
/*
函数名:insertDataToList
函数功能:插入数据到线性表
函数参数:
LIST * pList : 线性表首地址
data_t newData : 要插入的数据
int offset : 要插入的位置
函数返回值:成功时,返回0;失败时,返回-1。
*/
int insertDataToList( LIST * pList, data_t newData, int offset )
{
if ( TAIL == offset )//尾插
{
//插入数据
pList->data[pList->count] = newData;
//更新计数器
pList->count++;
}
else if ( HEAD == offset ) //头插
{
}
else //中间插入
{
}
return OK;
}
/*
函数名:showList
函数功能:显示
函数参数:LIST * pList : 线性表首地址
函数返回值:无
*/
void showList( LIST * pList )
{
int i = 0;
if ( NULL == pList )
{
return ;
}
for ( i = 0; i < pList->count; i++ )
{
printf( " %d ", pList->data[i] );
}
printf("\r\n");
}
/*
函数名: updateList
函数功能:修改
函数参数:
LIST * pList : 线性表首地址
data_t oldData : 旧的数据
data_t newData : 新的数据
函数返回值:成功时,返回0;失败时,返回-1。
*/
int updateList( LIST * pList, data_t oldData, data_t newData )
{
int i;
i=searchList(pList,oldData);
if(i!=-1)
{
pList->data[i]=newData;
return 0;
}
return -1;
}
/*
函数名: deleteFromList
函数功能:删除
函数参数:
LIST * pList : 线性表首地址
int offset : 要删除的位置
data_t * pData : 保存被删除元素
函数返回值:成功时,返回0;失败时,返回-1。
*/
int deleteFromList( LIST * pList, int offset, data_t * pData )
{
if ( TAIL == offset )//尾删
{
//保存数据
*pData=pList->data[pList->count-1];
//更新计数器
pList->count--;
}
else if ( HEAD == offset ) //头插
{
}
else //中间插入
{
}
return OK;
}
/*
函数名: searchList
函数功能:查询
函数参数:
LIST * pList : 线性表首地址
data_t oldData : 要查找的数据
函数返回值:成功时,返回下标;失败时,返回-1。
*/
int searchList( LIST * pList, data_t oldData )
{
int i;
for(i=0;i<pList->count;i++)
{
if(pList->data[i]==oldData)
return i;
}
return ERROR;
}
/*
函数名:isEmpty
函数功能:判断表空
函数参数:LIST * pList : 线性表首地址
函数返回值:线性表为空,返回1;否则,返回0。
*/
int isEmpty( LIST * pList )
{
if(pList->count==0)
{
return TRUE;
}
return FALSE;
}
/*
函数名:isFull
函数功能:判断表满
函数参数:LIST * pList : 线性表首地址
函数返回值:线性表为满,返回1;否则,返回0。
*/
int isFull( LIST * pList )
{
if(pList->count==SIZE)
{
return TRUE;
}
return FALSE;
}