编程点滴:ADT抽象数据类型的实现(顺序存储线性表C语言描述)

合集下载

adt表的编程与实现

adt表的编程与实现

adt表的编程与实现ADT表的编程与实现ADT(Abstract Data Type)表是一种抽象数据类型,用于存储和操作数据集合。

在计算机科学中,ADT表是一种非常常见且重要的数据结构,它提供了一种简单而有效的方式来组织和管理数据。

在本文中,我们将介绍ADT表的编程和实现方法。

一、ADT表的定义在计算机科学中,ADT表是一种抽象数据类型,用于存储一组数据元素,并提供一些操作来操作这些数据元素。

ADT表通常包含以下基本操作:1. 创建一个空表2. 向表中插入一个元素3. 从表中删除一个元素4. 查找表中是否包含某个元素5. 获取表的大小6. 获取表中的元素二、ADT表的实现ADT表可以通过各种不同的数据结构来实现,比如数组、链表、树等。

下面我们将介绍两种常见的ADT表实现方法:数组实现和链表实现。

1. 数组实现使用数组来实现ADT表是一种简单而高效的方法。

我们可以定义一个固定大小的数组来存储表中的元素,然后通过数组下标来访问和操作这些元素。

数组实现的ADT表具有以下特点:- 插入和删除操作的时间复杂度为O(1)- 查找操作的时间复杂度为O(n)- 需要预先确定表的最大容量2. 链表实现链表是另一种常见的数据结构,可以用来实现ADT表。

在链表实现中,每个元素都包含一个指向下一个元素的指针,从而形成一个链式结构。

链表实现的ADT表具有以下特点:- 插入和删除操作的时间复杂度为O(1)- 查找操作的时间复杂度为O(n)- 不需要预先确定表的最大容量三、ADT表的编程下面我们将通过一个简单的例子来演示如何使用C语言来实现一个基于链表的ADT表。

```c#include <stdio.h>#include <stdlib.h>// 定义表节点结构typedef struct Node {int data;struct Node* next;} Node;// 定义表结构typedef struct {Node* head;int size;} Table;// 创建一个空表Table* createTable() {Table* table = (Table*)malloc(sizeof(Table));table->head = NULL;table->size = 0;return table;}// 向表中插入一个元素void insert(Table* table, int data) {Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data;newNode->next = table->head;table->head = newNode;table->size++;}// 从表中删除一个元素void remove(Table* table, int data) { Node* current = table->head;Node* prev = NULL;while (current != NULL) {if (current->data == data) {if (prev == NULL) {table->head = current->next; } else {prev->next = current->next; }free(current);table->size--;return;}prev = current;current = current->next;}}// 查找表中是否包含某个元素int find(Table* table, int data) { Node* current = table->head; while (current != NULL) {if (current->data == data) { return 1;}current = current->next;}return 0;}// 获取表的大小int getSize(Table* table) {return table->size;}// 销毁表void destroyTable(Table* table) { Node* current = table->head; Node* next;while (current != NULL) {next = current->next;free(current);current = next;}free(table);}int main() {Table* table = createTable();insert(table, 1);insert(table, 2);insert(table, 3);printf("Size of table: %d\n", getSize(table));if (find(table, 2)) {printf("Table contains 2\n");}remove(table, 2);printf("Size of table: %d\n", getSize(table)); destroyTable(table);return 0;}```通过以上代码,我们实现了一个简单的基于链表的ADT表。

线性表ADT的顺序存储与链式存储实验报告

线性表ADT的顺序存储与链式存储实验报告

实验报告题目:完成线性表ADT的顺序存储和链式存储方式的实现一、需求分析1、本演示程序中,线性表的数据元素类型限定为整型2、演示程序以用户和计算机的对话方式执行,即在计算机的终端上显示“提示信息”之后由用户在键盘上键入演示程序规定的运算命令,相应的输出结果显示在后面。

3、程序的执行命令包括:创建、撤销、清空、插入、修改、删除、定位等线性表ADT各项基本操作二、概要设计为实现上述功能,我们给出线性表的抽象数据类型定义,具体的有单向链,双向链,顺序表等,同时对于上述功能的实现还采用有/无头结点两种方式来实现1.线性表的抽象数据类型定义为ADT List{数据对象:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<a i-1,a i>|ai-1,ai∈D,i=2,…,n}基本操作:InitList(&L)操作结果:构造一个空的线性表LDestroyList(&L)初始条件:线性表L已存在。

操作结果:销毁线性表L。

ClearList(&L)初始条件:线性表L已存在。

操作结果:将L重置为空表。

ListEmpty(L)初始条件:线性表L已存在。

操作结果:若L为空表,则返回TRUE,否则返回FALSE。

ListLength(L)初始条件:线性表L已存在。

操作结果:返回L中的i个数据元素的值。

GetElem(L,i,&e)初始条件:线性表L已存在,1≤i≤ListLength(L)。

操作结果:用e返回L中第i个数据元素的值。

LocateElem(L,e,compare())初始条件:线性表L已存在,compare()是数据元素判定函数操作结果:返回L中第一个与e满足compare()的数据元素的位序。

若这样的数据元素不存在,则返回值为0.PriorElem(L,cur_e,&pre_e)初始条件:线性表已存在操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。

抽象数据类型在C语言中的实现

抽象数据类型在C语言中的实现

抽象数据类型在C语言中的实现抽象数据类型(Abstract Data Type,ADT)是指一种数据类型及其相关操作的集合,它仅根据其行为特征来描述数据类型,而不考虑具体的实现细节。

ADT的实现在不同的编程语言中有不同的方式,本文将探讨在C语言中实现ADT的方法和技巧。

一、ADT的概念和特点ADT是指抽象出的数据类型,它的基本特点包括:封装性、继承性和多态性。

封装性:ADT隐藏了数据类型的内部实现细节,只暴露对外的接口函数。

这样可以有效地保护数据并提供更好的封装。

继承性:ADT可以通过定义派生类型来扩展,从而实现继承关系。

多态性:同一种基本的ADT可以有不同的实现方式,不同的实现方式可以满足不同的使用需求。

二、使用结构体实现ADT在C语言中,可以使用结构体来实现ADT。

结构体可以将不同类型的变量组合在一起,形成一个更复杂的数据类型。

下面以一个简单的例子来说明如何使用结构体实现ADT。

假设我们需要实现一个有理数类型(Rational)的ADT,它包括两个整数类型的成员变量:分子和分母。

```ctypedef struct {int numerator; // 分子int denominator; // 分母} Rational;```我们可以通过定义一系列的函数来操作这个有理数类型。

比如,我们可以定义创建有理数的函数、有理数相加的函数等等。

```cRational create(int numerator, int denominator) {Rational r;r.numerator = numerator;r.denominator = denominator;return r;}Rational add(Rational r1, Rational r2) {Rational result;result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;result.denominator = r1.denominator * r2.denominator;return result;}// 其他操作函数...```通过以上的定义和函数实现,我们可以在程序中创建有理数类型的变量,并对其进行各种操作。

adt表的编程与实现

adt表的编程与实现

adt表的编程与实现
ADT表的编程与实现
ADT 表(Abstract Data Type Table)是一种通用的数据结构,在常见的面向对象编程语言中都有其对应的实现,是常用的数据表示方式之一。

ADT 表是一个有序的集合,它的每一项由两部分组成:键和其关联的值,每一项都是一个对,该对由键和其关联的值表示。

ADT表可以根据键确定值,也可以根据值查找对应的键。

ADT表可以用于存储任何键值对,并且支持常见的搜索、插入、删除等操作。

它的实现可以有很多种,具体实现方式可以是哈希表,二叉搜索树,顺序表等。

实现方式
1. 哈希表:这是最常见的实现方式,先对键进行哈希计算,得到一个哈希码;接着通过将哈希码折半,或者以某种形式将哈希码映射到表中,将值和键存储在表中。

优点是快速查找,缺点是容易出现冲突。

2. 二叉搜索树:具有有序性,根据比较大小的规则,将键值对插入到二叉搜索树中。

优点是查找效率高,缺点是插入效率低,而且无法很好的处理较多的重复键值情况。

3. 顺序表:将键值对按照键的大小存入到顺序表中。

优点是插入效率高,缺点是查找效率低。

最佳实现方式
综合以上方式的优缺点,建议采用哈希表的方式实现 ADT表,它的查找效率高,且能够有效解决大量重复键值情况。

同时,还可以采用冲突处理机制,有效解决哈希表出现冲突问题,从而提高查找效率。

线性表的顺序存储(C代码实现)

线性表的顺序存储(C代码实现)

线性表的顺序存储(C代码实现)线性表的顺序存储--线性表是最基本、最简单、也是最常⽤的⼀种数据结构。

线性表(linear list)是的⼀种,⼀个线性表是n个具有相同特性的数据元素的有限序列。

线性表⽰什么?借助⽹上⼤佬的⼀个例⼦⼩学⽣放学都是要按顺序排队的,⼀个接⼀个,每个⼩学⽣的前后位置是固定的,这样便于迅速清点。

其实这就是⼀个线性表,从这件事⾥我们就可以找到很多关于线性表的特性,如1、线性表是⼀个序列,它是有顺序的(排队)2、第⼀个元素⽆前驱,最后⼀个⽆后继,其他每个元素都有⼀个前驱和后继(⼀个接⼀个)3、元素是有限的(⼩学⽣的个数是有限的)4、数据类型都相同(都是⼩学⽣在排队)那么我们如何定义⼀个节点呢?/*定义线性表类型*/typedef struct{ElemType data[MAXSIZE];int length;}sqList;结构较简单,⼀个数组⽤于存放元素信息和⼀个长度⽤于下⾯操作代码实现的功能包括线性表的初始化,判断是否为空、清空、增加元素、删除元素、合并线性表等操作。

#include <stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20 /*初始化存储空间*//*取别名,便以操作*/typedef int Status;typedef int ElemType;/*定义线性表类型*/typedef struct{ElemType data[MAXSIZE];int length;}sqList;/*初始化顺序线性表*/Status InitList(sqList *L){L->length=0;return OK;}/*初始条件:顺序表已存在,操作结果:若L为空,则返回TRUE,否则返回FALSE*/ Status ListEmpty(sqList* L){if(L->length==0)return TRUE;elsereturn FALSE;}/* 初始条件:顺序线性表L已存在。

数据结构线性表的顺序存储结构C语言实现

数据结构线性表的顺序存储结构C语言实现

数学与信息技术学院2016~2017(下)学年
计科专业2015级《数据结构》实验报告 1 学号:2015201018 姓名:汪继超
fflush(stdin);//清空在此前输入缓冲区
a=getchar();
if(a=='y'||a=='Y')
{
flag=1;
system("cls"); /*清屏*/
Menu(); /*调用菜单函数*/
printf("请再次选择你需要操作的步骤(0--7): ");
fflush(stdin);//清空在此前输入缓冲区
scanf("%d",&n);
}
else
{
free(L);//释放顺序表
exit(0);
}
}
}
实验结果:
1.表初始化:
2.建表:
注:若以空格键隔开数据,多输入无影响,计算机读取完指定数目数据后,自动结束读取。

3-1.插入位置合法:
3-2.插入位置不合法:4.删除:
5-1.查找成功:
5-2.查找-没有相应数据:
6-1.找到修改元素,并确定修改:6-2.找到修改元素,不修改:
6-3.没找到修改元素:
问题讨论:
1.元素插入及删除过程中,计算机储存结构中元素位置从0开始,但面向用户时,应考虑人的自然思维,即面向用户时应以1为第一个元素位置,计算机实现需要把位置i=i+1.。

编程点滴:ADT抽象数据类型的实现(链式存储线性表C语言描述)

编程点滴:ADT抽象数据类型的实现(链式存储线性表C语言描述)

编程点滴:ADT抽象数据类型的实现(链式存储线性表C 语⾔描述)编程点滴:ADT抽象数据类型的实现(链式存储线性表C语⾔描述)下⾯是有关链式存储的线性表ADT抽象数据类型的C语⾔实现⽅法。

共3个⽂件,头⽂件,函数实现,测试程序。

/*********************************** ********************************** *** * Name: * Desc: C语⾔ADT(抽象数据类型)的实现*本结构为线性表, 以链式存储⽅式组织*实现的操作有: *结构初始化/销毁与空间释放/向头部或尾部加⼊记录/在指定位置加⼊记录*/在有序表中根据给定条件寻找合适位置加⼊记录/删除指定位置的记录*/删除符合条件的记录/读取指定位置记录/查找符合条件的记录*/按给定的条件排序(可⾃定义排序依据的字段及排序⽅向) * Author: Joshua Chan * Date: 2011-11-03*********************************** ********************************** ***/ #ifndef _LINK_H_ #define _LINK_H_ #include /* 数据类型, ⽤户不可见*/ structnode_st{ void*datap; structnode_st*prev,*next; }; structlist_st{ structnode_st head; intelmsize; intelmnr; }; /* 接⼝声明*/ typedefvoidproc_func_t(void*); typedefintcomp_func_t(void*,void*); typedefvoid* LIST_T; LIST_Tlist_init(constintelmsize);intlist_release(LIST_T ptr); intlist_putif(LIST_T ptr,comp_func_t comp,void*datap,constboolord);intlist_putpos(LIST_Tptr,void*datap,constintpos);intlist_append(LIST_T ptr,void*datap); intlist_prepend(LIST_T ptr,void*datap); intlist_delete_pos(LIST_T ptr,constintpos); intlist_delete(LIST_T ptr,comp_func_t comp,void*key); intlist_travel(LIST_T ptr,proc_func_tproc);void*list_getpos(LIST_T ptr,constintpos); void*list_find(LIST_T ptr,comp_func_t comp,void*key); intlist_sort(LIST_Tptr,comp_func_t comp,constboolord); #endif /* ********************************** ********************************** *** * Name: * Desc: C语⾔ADT(抽象数据类型)的实现*本结构为线性表, 以链式存储⽅式组织*实现的操作有: *结构初始化/销毁与空间释放/向头部或尾部加⼊记录/在指定位置加⼊记录*/⾃动在有序表中寻找合适位置加⼊记录/删除指定位置的记录*/删除符合条件的记录/读取指定位置记录/查找符合条件的记录*/按给定的条件排序(可⾃定义排序依据的字段及排序⽅向) * Author: Joshua Chan * Date: 2011-11-03 *********************************** ********************************** ***/ #include #include #include #include\ /* 判断要获取的位置是否有效*/ staticinlineboolgetpos_invalid(LIST_T ptr,constintpos){ return(pos>(((structlist_st*)ptr)->elmnr-1)||pos(((structlist_st*)ptr)->elmnr)||posel mnr==0?true:false; } /* 结构初始化*/ LIST_T list_init(constintelmsize) { structlist_st*newlist; newlist=malloc(sizeof(structlist_st));if(newlist== NULL) return NULL; newlist->elmsize=elmsize;newlist->elmnr=0; newlist->= NULL; newlist->=&newlist->head;newlist->=&newlist->head;return(LIST_T)newlist; } /* 结构销毁, 空间释放*/ intlist_release(LIST_T ptr) { structlist_st*me =ptr; structnode_st*cur,*save;for(cur = me->;cur !=&me->head; cur = save){save = cur->next;free(cur->datap); free(cur); }free(me); return0; } /* 预分配空间*/ staticstructnode_st*node_alloc(LIST_T ptr,void*datap) { structlist_st*me =ptr; structnode_st*newnode;newnode=malloc(sizeof(structnode_st));if(newnode== NULL) return NULL; newnode->datap=malloc(me->elmsize);if(newnode->datap==NULL){free(newnode); return NULL; } memcpy(newnode->datap,datap,me->elmsize); returnnewnode; } /* 根据给定条件选择合适位置加⼊记录, 适⽤于有序表*/ intlist_putif(LIST_T ptr,comp_func_t comp,void*datap,constboolord){ structlist_st*me =ptr; structnode_st*cur,*newnode; bool sig; if(list_empty(me)) return-1;newnode=node_alloc(ptr,datap);if(newnode== NULL) return-1; for(cur = me->; cur !=&me->head; cur = cur->next){sig = comp(cur->datap,datap)>0?true:false; if(!(sig rd)) break; } newnode->prev= cur->prev; newnode->next= cur; cur->prev->next=newnode;cur->prev=newnode;me->elmnr++; return0;/* Name: * Desc: C语⾔ADT(抽象数据类型)的实现测试程序* Author: Joshua Chan * Date: 2011-11-03 */ #include #include#include\ /* ⽤户⾃定义结构*/ structinfo_st{ int id; char name[20]; int age; }; /* ⽤户⾃定义⽐较函数*/intcomp_id(void*data1,void*data2) { structinfo_st*a = data1; structinfo_st*b = data2; if(a->id == b->id) return0;return(a->id > b->id)?1:-1; } /* ⽤户⾃定义⽐较函数*/ intcomp_name(void*data1,void*data2) { structinfo_st*a = data1; structinfo_st*b = data2; returnstrcmp(a->name, b->name); } /* ⽤户⾃定义⽐较函数*/ intcomp_age(void*data1,void*data2) { structinfo_st*a = data1; structinfo_st*b = data2; if(a->age == b->age) return0; return(a->age > b->age)?1:-1; } /* ⽤户⾃定义操作函数*/ voidproc_print(void*data){ structinfo_st*a = data; printf(\, a->id, a->name, a->age); } voidprint_title(void) { printf(\); } structinfo_stput_data(intid,char*name,int age) { structinfo_stnew; = id; strcpy(, name); = age; returnnew; } /* 测试程序*/ int main(void) {LIST_T l; structinfo_sti; l =list_init(sizeof(structinfo_st)); /* 追加5条记录*/ i=put_data(3,\,20); list_append(l,&i); i=put_data(5,\,43);list_append(l,&i); i=put_data(7,\,3); list_append(l,&i); i=put_data(9,\,14); list_append(l,&i); i=put_data(11,\,28);list_append(l,&i); /* 遍历结构, 同时调⽤给定的函数*/ printf(\); print_title(); list_travel(l,proc_print); /* 在前端加⼊1条记录, 并查看效果*/ i=put_data(4,\,59); list_prepend(l,&i); printf(\); print_title(); list_travel(l,proc_print); /* 在指定位置加⼊1条记录*/i=put_data(2,\,33); list_putpos(l,&i,2); printf(\); print_title(); list_travel(l,proc_print); /* 取出指定位置的记录, 并显⽰*/ i=* (structinfo_st*)list_getpos(l,3); printf(\); print_title(); proc_print(&i); /* 查找符合条件的记录, 并显⽰*/ i=put_data(0,\,0);i=*(structinfo_st*)list_find(l,comp_name, &i); printf(\); print_title(); proc_print(&i); /* 按name升序排序*/list_sort(l,comp_name,true); printf(\);print_title(); list_travel(l,proc_print); /* 按age降序排序*/ list_sort(l,comp_age,false); printf(\); print_title(); list_travel(l,proc_print); /* ⾃动按age顺序将记录加⼊到合适的位置*/ i=put_data(1,\,30); list_putif(l,comp_age,&i,false); printf(\); print_title();list_travel(l,proc_print); /* 按id升序排序*/ list_sort(l,comp_id,true); printf(\); print_title(); list_travel(l,proc_print); /* 删除指定位置记录*/ list_delete_pos(l,3); printf(\); print_title(); list_travel(l,proc_print); /* 删除符合条件的记录*/ i=put_data(0,\,0);list_delete(l,comp_name,&i); printf(\); print_title(); list_travel(l,proc_print); /* 结构销毁, 释放空间*/ list_release(l); return0; }。

线性表的存储方式及其操作(C语言版)

线性表的存储方式及其操作(C语言版)

线性表的存储⽅式及其操作(C语⾔版)该篇也是复习数据结构总结的,虽然很简单但⽅便以后使⽤。

线性表的顺序存储1.定义⼀个结构体,因为在⾼级语⾔中数组具有随机存储的特性,所以通常⽤数组来表⽰顺序存储。

typedef struct LNode *List;struct LNode{ElementType Data[maxsize];int last; //线性表的长度为 last+1};struct LNode L; //定义了⼀个结构体List PtrL; //定义了⼀个结构体指针访问下标 i的元素为 L.Data[i] 或者为 Ptr-> Data[i]2.初始化操作List MakeEmpty(){List PtrL;PtrL = (List)malloc(sizeof(struct LNode));PtrL->last = -1;return PtrL;}3.查找操作int Find(ElementType X,List PtrL){int i = 0;while(i<=PtrL->last && PtrL ->Data[i] != X)i++;if(i>PtrL->last) return -1;else return i;}4.插⼊操作时间复杂度为 O(N)void Insert(ElementType X,int i,List PtrL){int j;if(PtrL->last == maxsize-1){printf("表满");return;}if(i<1 || i>PtrL->last+2) /*因为插⼊的是第 i个位置的元素 (1<=i<=1+n)*/{printf("位置不合法");return;}for(j=PtrL->last;j>=i-1;j--)PtrL->Data[j+1]=PtrL->Data[j]; /* 将 ai ~an 倒序向后移动*/PtrL->Data[i-1] = X;PtrL->last++;return;}5.删除操作第i个元素 1<=i<=nvoid Delete(int i,List PtrL){int j;if(i<1 || i>PtrL->last){printf("不存在第%d个元素",i);return;}for(j=i;j<=PtrL->last;j++)PtrL->Data[j-1] = PtrL->Data[j];PtrL->last--;return;}线性表的链式存储结构1.结构体typedef struct LNode *List;struct LNode{ElementType Data;List Next; //线性表的长度为 last+1};struct LNode L; //定义了⼀个结构体List PtrL; //定义了⼀个结构体指针访问下标 i的元素为 L.Data[i] 或者为 Ptr-> Data[i]2.因为链表不像顺序表那样数组直接有表长,所以我们加上⼀个求表长的操作。

线性表和顺序储存

线性表和顺序储存

线性表和顺序储存1.线性表的定义
如果我们把线性表简化成⼀个逻辑结构图,则可以下⾯这张图来表⽰:
线性表的特点如下:
2.线性表当中的顺序储存的定义:
采⽤顺序储存结构的线性表我们通常称为顺序表。

线性表当中的元素我们表⽰为ai,i是我们的逻辑地址,则顺序表当中的元素地址计算公式为:
下⾯是顺序表储存结构⽰意图:
利⽤C语⾔来描述顺序表的数据存储,代码如下:
调⽤我们的顺序表⼀般使⽤的代码是:
我们需要区分数据元素和数组的下标,⼀般⽽⾔我们数据元素当中的第⼀个元素a1所对应的数组元素是L.elem[0] 3.线性表的运算
1.查找操作:
按照内容查找的C语⾔语句为:
顺序表的插⼊算法流程.⾸先我们如果想在第i个位置插⼊⼀个元素,则应该把第i个位置以及其后⾯的元素都往后移动⼀个位置了,然后再往⾥⾯进⾏插⼊,下⾯是插⼊算法的C语⾔实现过程:
删除算法的C语⾔实现如下图所⽰:
以上就是我们线性表的全部知识点了。

抽象数据类型定义(ADT)

抽象数据类型定义(ADT)

抽象数据类型定义(ADT)⼀、抽象数据类型定义(ADT)作⽤:抽象数据类型可以使我们更容易描述现实世界。

例:⽤线性表描述学⽣成绩表,⽤树或图描述遗传关系。

定义:⼀个数学模型以及定义在该模型上的⼀组操作。

关键:使⽤它的⼈可以只关⼼它的逻辑特征,不需要了解它的存储⽅式。

定义它的⼈同样不必要关⼼它如何存储。

例:线性表这样的抽象数据类型,其数学模型是:数据元素的集合,该集合内的元素有这样的关系:除第⼀个和最后⼀个外,每个元素有唯⼀的前趋和唯⼀的后继。

可以有这样⼀些操作:插⼊⼀个元素、删除⼀个元素等。

抽象数据类型分类原⼦类型值不可分解,如int固定聚合类型值由确定数⽬的成分按某种结构组成,如复数可变聚合类型值的成分数⽬不确定如学⽣基本情况抽象数据类型表⽰法:⼀、三元组表⽰:(D,S,P)其中D是数据对象,S是D上的关系集,P是对D的基本操作集。

⼆、书中的定义格式:ADT 抽象数据类型名{数据对象:<数据对象的定义>数据关系:<数据关系的定义>基本操作:<基本操作的定义>}ADT 抽象数据类型名例:线性表的表⽰名称线性表数据对象D={a i| a i(-ElemSet,i=1,2,...,n,n>=0}任意数据元素的集合数据关系R1={i-1,a i>| a i-1,a i(- D,i=2,...,n}除第⼀个和最后⼀个外,每个元素有唯⼀的直接前趋和唯⼀的直接后继基本操作ListInsert(&L,i,e)L为线性表,i为位置,e为数据元素。

ListDelete(&L,i,e)...⼆、类C语⾔语法类C语⾔语法⽰例1、预定义常#define TRUE 1 #define FALSE 0 #define OK 1#define ERROR 0量和类型#define INFEASIBLE -1#define OVERFLOW -2typedef in Status; //Status是函数的类型,其值是函数结果状态代码。

抽象数据类型的表示与实现_数据结构(C语言版)_[共4页]

抽象数据类型的表示与实现_数据结构(C语言版)_[共4页]

2.抽象数据类型抽象就是抽取出实际问题的本质。

在计算机中使用二进制数来表示数据,在汇编语言中则可给出各种数据的十进制表示,它们是二进制数据的抽象,使用者在编程时可以直接使用,不必考虑实现细节。

在高级语言中,则给出更高一级的数据抽象,出现了数据类型,如整型、实型、字符型等,可以进一步利用这些类型构造出线性表、栈、队列、树、图等复杂的抽象数据类型。

抽象数据类型(Abstract Data Type,ADT)一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象,数据对象上关系的集合,以及对数据对象的基本操作的集合。

抽象数据类型的定义格式如下:ADT 抽象数据类型名 {数据对象:〈数据对象的定义〉数据关系:〈数据关系的定义〉基本操作:〈基本操作的定义〉} ADT 抽象数据类型名其中,数据对象和数据关系的定义采用数学符号和自然语言描述,基本操作的定义格式为基本操作名(参数表)初始条件:〈初始条件描述〉操作结果:〈操作结果描述〉基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以“&”打头,除可提供输入值外,还将返回操作结果。

“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若初始条件为空,则省略。

“操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。

1.3 抽象数据类型的表示与实现运用抽象数据类型描述数据结构,有助于在设计一个软件系统时,不必首先考虑其中包含的数据对象,以及操作在不同处理器中的表示和实现细节,而是在构成软件系统的每个相对独立的模块上定义一组数据和相应的操作,把这些数据的表示和操作细节留在模块内部解决,在更高的层次上进行软件的分析和设计,从而提高软件的整体性能和利用率。

抽象数据类型的概念与面向对象方法的思想是一致的。

抽象数据类型独立于具体实现,将数据和操作封装在一起,使得用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,从而实现了信息隐藏。

C语言ADT(抽象数据类型编程)(含Demo演示文件)

C语言ADT(抽象数据类型编程)(含Demo演示文件)

C语⾔ADT(抽象数据类型编程)(含Demo演⽰⽂件)C语⾔是⼀种计算机程序设计语⾔。

它既具有⾼级语⾔的特点,⼜具有汇编语⾔的特点。

它可以作为⼯作系统设计语⾔,编写系统应⽤程序,也可以作为应⽤程序设计语⾔,编写不依赖计算机硬件的应⽤程序。

因此,它的应⽤范围⼴泛,不仅仅是在软件开发上,⽽且各类科研都需要⽤到C语⾔,具体应⽤⽐如单⽚机以及嵌⼊式系统开发。

(摘⾃“百度百科”)在嵌⼊式系统开发中,随着系统功能要求越来越多,除了硬件系统不断扩展外,芯⽚中软件设计的规模也越来⼤,算法越来越复杂,所以需要对程序结构进⾏良好设计,⽅便后来的修改和维护。

下⾯是对ADT的⼀些简单介绍:1.2.1 ADT定义及主要特点:为类型的属性和可对类型执⾏的操作提供⼀个抽象的描述。

不受特定的实现和编程语⾔的约束。

这种正式的抽象描述被称为抽象数据类型(Abstract Data Type,ADT)。

抽象数据类型概念的引⼊,降低了⼤型软件设计的复杂性;提⾼了系统的可读性与可维护性;使系统的各部分相对隔离,在⼀定程序上解决了软件的可靠性、⽣产率等⽅⾯的问题。

1.2.2定义步骤:1、定义⼀个数据类型。

提供存储数据的⽅式,提供操作数据的⽅式。

2、开发⼀个实现该ADT的编程接⼝。

即说明如何存储数据,并描述⽤于执⾏所需操作的函数集合。

例如,提供⼀个结构体类型的定义,同时提供⽤来操作该结构体的函数的原型。

3、编写代码实现这个接⼝。

1.2.3抽象数据类型优点:程序便于维护,灵活应对需求的变更;如果有些功能运⾏不正常,可以将问题集中到⼀个函数上;如果想⽤更好的办法来完成⼀个任务,⽐如添加项⽬,则只需重新编写那⼀个函数;如果需要增加新的属性或操作,则修改抽象类型即可。

上⾯的都是在本科阶段学习C++⾥⾯的⼀讲《抽象数据类型》⾥⾯的内容。

当时教学时是先讲C++基本的语法规则,再讲类。

C++基本的语法规则和C语⾔基本类似,所以在讲C++“⾯向对象”最重要的特点――类之前,⽤“抽象数据类型”进⾏了⼀次过渡。

用C语言定义线性表的顺序存储结构

用C语言定义线性表的顺序存储结构

用C语言定义线性表的顺序存储结构线性表顺序存储的表示:线性表的顺序存储结构可以借助于高级程序设计语言中的一维数组来表示,一维数组的下标与元素在线性表中的序号相对应。

线性表的顺序存储结构可用C语言定义如下:#define MAXSIZE /*线性表可能达到的最大长度;*/ typedef struct{ElemType elem[MAXSIZE];/* 线性表占用的数组空间。

*/ int last;/*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/} SeqList;说明:(1)结点类型定义中ElemType数据类型是为了描述的统一而自定的,在实际应用中,用户可以根据自己实际需要来具体定义顺序表中元素的数据类型,如int、char、float或是一种struct结构类型。

(2)从数组中起始下标为0处开始存放线性表中第一个元素。

因此需要注意区分元素的序号和该元素在数组中的下标之间的对应关系,即数据元素a1在线性表中的序号为1,其对应的elem数组的下标为0;ai在线性表中的序号为i,其对应的elem数组的下标为i-1。

利用定义的顺序表的数据类型SeqList就可以定义变量了。

变量L的定义与使用方法有两种:(1)通过变量定义语句:SeqList L将L定义为SeqList类型的变量,可通过L.elem[i-1]来访问顺序表中序号为i的元素a i;通过st 可得到顺序表中最后一个元素的下标,而st+1就是顺序表的长度。

(2)通过指针变量定义语句:SeqList *L将L定义为指向SeqList类型的指针变量,使用时,可通过L->elem[i-1]来访问顺序表中序号为i的元素a i,通过L->last+1可得到顺序表的长度。

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。

这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

【数据结构】线性表顺序表详解和代码实例

【数据结构】线性表顺序表详解和代码实例

【数据结构】线性表顺序表详解和代码实例线性表(List)是零个或者多个数据元素的有限序列.⾸先它是⼀个序列.⾥⾯的元素是有顺序的,如果有多个元素,除开头和结尾以外的元素都有⼀个前驱和⼀个后继.⽽开头元素只有后继,结尾元素只有前驱.其次线性表是有限的,也就是⾥⾯的元素个数是有限的。

1ADT 线性表(List)2Data3线性表的数据对象集合为{a1, a2, a3, ......, an},每个元素类型为DataType。

4Operation5InitList(L); //初始化线性表6 IsEmptyList(L); //判断线性表是否为空7 ClearList(L); //清空线性表8 GetElemList(L, i, *e); //获取第i个位置的数据9 SearchList(L, e); //查找与数据e相等的元素10 InsertNodeList(L, i, e);//在第i个位置插⼊元素11 DeleteNodeList(L, i, *e);//删除第i个位置的元素,e获取删除元素12 GetLengthList(L); //获取线性表的长度13endADT关于线性表的基本操作就上⾯⼏种,还有⼏个例如线性表的排序,合并,逆序等等操作。

为了⽂章篇幅,就下次再介绍了。

线性表的顺序存储结构,就是指 ⽤⼀段地址连续的存储单元⼀次存储线性表的数据元素。

学过⾼级语⾔的朋友,相信对数组这玩意⼉都不会陌⽣吧。

数组就是⼀种顺序存储结构。

链式存储结构就是可以⽤⼀组任意的内存单元存储线性表中的元素。

与顺序存储不同的是,这组内存单元可以是连续的,也可以是不连续的。

这就意味着,元素可以存储在内存的任意位置。

正因为如此,在链式结构中,每个元素不仅要存它的信息,还需要存储它后继元素的存储地址。

我们把存储元素信息的域称为数据域,⽽把存储后继元素地址的域称为指针域。

由这两部分共同组成的数据元素ai,则可以称之为节点(Node)。

线性表的顺序存储表示_数据结构(C语言版)(第2版)_[共2页]

线性表的顺序存储表示_数据结构(C语言版)(第2版)_[共2页]

23 于一元多项式的运算可以看作是线性表的合并,合并过程需要不断地进行元素的插入操作。

其他如求线性表的拆分、复制等操作也都可以利用上述基本操作的组合来实现。

(3)对于不同的应用,基本操作的接口可能不同。

例如,案例2.2的删除操作,如果要求删除图书表中ISBN 为x 的图书,首先需要根据x 确定该图书在线性表中的位置,然后再利用ListDelete(&L,i)基本操作将该种图书记录从表中删除。

(4)由抽象数据类型定义的线性表,可以根据实际所采用的存储结构形式,进行具体的表示和实现。

2.4 线性表的顺序表示和实现2.4.1 线性表的顺序存储表示线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。

通常,称这种存储结构的线性表为顺序表(Sequential List )。

其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的。

假设线性表的每个元素需占用l 个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。

则线性表中第i + 1个数据元素的存储位置LOC(a i + 1)和第i 个数据元素的存储位置LOC(a i )之间满足下列关系:LOC(a i + 1) = LOC(a i ) + l一般来说,线性表的第i 个数据元素a i 的存储位置为:LOC(a i ) = LOC(a 1) + (i − 1) × l式中,LOC(a 1)是线性表的第一个数据元素a 1的存储位置,通常称作线性表的起始位置或基地址,表中相邻的元素a i 和a i + 1的存储位置LOC(a i )和LOC(a i + 1)是相邻的。

每一个数据元素的存储位置都和线性表的起始位置相差一个常数,这个常数和数据元素在线性表中的位序成正比(见图2.2)。

由此,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。

线性表的顺序存储结构(C语言实现)

线性表的顺序存储结构(C语言实现)

线性表的顺序存储结构(C语⾔实现)1 #include <stdio.h>2 #include <stdlib.h>34#define OK 15#define ERR 26#define TRUE 17#define FALSE 08#define MAXSIZE 20 //定义线性表的最⼤长度910 typedef int status; //定义函数返回的状态,OK & ERR11 typedef char datatype; //定义线性表中每个结点的数据类型,这⾥暂定为字符型1213 typedef struct {14 datatype data[MAXSIZE]; //存储着线性表中的每个结点15int length; //线性表当前的长度16 } SequenceList;1718/* 函数原型,线性表的基本操作 */19 SequenceList *createSequenceList(void);20 status isEmpty(SequenceList *L);21void clear(SequenceList *L);22int getLength(SequenceList *L);23int locateNode(SequenceList *L,datatype node_to_locate);24 datatype getNode(SequenceList *L, int index);25 status insert(SequenceList *L, int index, datatype node_to_insert);26 status delete(SequenceList *L, int index);27void showList(SequenceList *L);2829int main(){30/* 测试 */31 SequenceList *root; //指向线性表32 root=createSequenceList(); //创建⼀个线性表33 printf("Length = %d\n",getLength(root)); //打印线性表的当前长度34 printf("isEmpty = %d\n",isEmpty(root)); //打印线性表是否为空35 insert(root,0,'A'); //分别插⼊4个结点36 insert(root,0,'B');37 insert(root,1,'C');38 insert(root,1,'D');39 printf("Length = %d\n",getLength(root));40 printf("isEmpty = %d\n",isEmpty(root));41 showList(root); //打印线性表42 putchar('\n');43 delete(root,1); //删除index=1(数组下标为1)的结点44 showList(root);45 putchar('\n');46 printf("Locate = %d\n",locateNode(root,'A')); //打印查找到的结点的位置47 printf("getNode = %c\n",getNode(root,1)); //打印下标是1的结点的值48 clear(root); //清空线性表49 printf("isEmpty = %d",isEmpty(root));5051return0;52 }5354 SequenceList *createSequenceList(void){55 SequenceList *tmp;56 tmp=malloc(sizeof(SequenceList));//void*类型指针能⾃动转为其他类型的指针57 tmp->length=0; //初始化线性表长度58return tmp;59 }60 status isEmpty(SequenceList *L){61if (L->length==0)62return TRUE;63else64return FALSE;65 }66void clear(SequenceList *L){67 L->length=0;68 }69int getLength(SequenceList *L){70return L->length;71 }72int locateNode(SequenceList *L, datatype node_to_locate){73//返回找到的结点的index74//node_to_locate应当是能唯⼀标识⼀个结点的数据,否则只返回匹配的第⼀个结点75int i;76for (i=0; i<L->length; i++){77if (L->data[i]==node_to_locate)78return i;79 }80return -1; //未找到任何匹配81 }82 datatype getNode(SequenceList *L, int index){83//index表⽰线性表中第N个结点,头结点的index是084if (L->length==0 || index<0 || index>L->length-1) return (datatype)ERR; 85return L->data[index];86 }87 status insert(SequenceList *L, int index, datatype node_to_insert){88//node_to_insert表⽰想要插⼊的结点89//当列表为空时,只有index=0才能插⼊90int k;91if (L->length == MAXSIZE) return ERR; //线性表已满92if (index<0 || index>L->length) return ERR; //index不在有效范围93if (index<L->length){94//插⼊的位置不是最后⼀个结点的下⼀个结点95for (k=L->length-1; k>=index; k--){96 L->data[k+1]=L->data[k]; //将要插⼊结点后⾯的所有结点都往后移97 }98 }99 L->data[index]=node_to_insert; //将新结点插⼊100 L->length++;101return OK;102 }103 status delete(SequenceList *L, int index){104int k;105if (L->length == 0) return ERR; //线性表为空106if (index<0 || index>L->length-1) return ERR; //index不在有效范围107if (index<L->length-1){108//删除的位置不是最后⼀个结点109for (k=index; k<L->length-1; k++){110 L->data[k]=L->data[k+1]; //将删除位置后⾯的结点都往前移111 }112 }113 L->length--;114return OK;115 }116void showList(SequenceList *L){117int i;118for (i=0; i<L->length; i++){119 printf("%c\t",L->data[i]);120 }121 }122123/*124顺序存储结构的线性表的优缺点:125优点:126 1.不必为每个结点之间的逻辑关系增加额外的存储空间127 2.可以快速地读和写表中任意⼀个结点128缺点:129 1.插⼊和删除需要移动⼤量结点130 2.线性表动态变化较⼤,难以确定所需的存储空间131 3.数组预设过长会造成空间浪费(存储碎⽚)132*/133/* 环境: Code::Blocks with GCC 5.1 */运⾏截图:。

C语言抽象数据类型ADT

C语言抽象数据类型ADT

C语⾔抽象数据类型ADT
根据编程的问题匹配合适的数据类型。

数据项连接构成了链表,定义了⼀个结构代表单独的项。

设计了⼀些⽅法把⼀系列结构构成⼀个链表。

本质上,我们使⽤C语⾔的功能设计了⼀种符合程序要求的新的数据类型。

但是上述的做法不系统。

我们要使⽤更系统的⽅法定义数据类型。

类型指两种信息:属性和操作。

定义⼀个新的数据类型,⾸先必须提供储存数据的⽅法。

其次必须提供操控数据的⽅法。

计算机科学领域已开发了⼀种定义新类型的好⽅法,⽤3步完成从抽象到具体的过程。

1、提供类型属性和相关操作的抽象描述。

这些描述既不能依赖特定的实现,也不能依赖特定的编程语⾔。

这种正式的抽象描述被称为抽象数据类型(ADT)。

2、开发⼀个实现ADT的编程接⼝。

要指明如何储存数据和执⾏所需操作的函数。

例如在C中提供结构的定义,操控该结构的函数原型。

需要使⽤该新类型的程序员可以使⽤该接⼝进⾏编程。

3、编写代码实现接⼝,这⼀步⾄关重要,但是使⽤该类型的程序员不⽤关⼼实现细节。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C语⾔中使⽤抽象数据类型⽅法进⾏编程包含3个步骤:
1、以抽象、通⽤的⽅式描述⼀个类型,包括该类型的操作;
2、设计⼀个函数接⼝表⽰这个新类型;
3、编写具体代码实现这个接⼝;。

线性表的顺序存储C++代码实现

线性表的顺序存储C++代码实现

线性表的顺序存储C++代码实现 关于线性表的概念,等相关描述请参看《⼤话数据结构》第三章的内容,1 概念 线性表list:零个或多个数据的有限序列。

可以这么理解:糖葫芦都吃过吧,它就相当于⼀个线性表,每个⼭楂就相当于线性表中的数据。

(这很类似与线性表的顺序存储结构) 线性表有两种存储结构,顺序存储结构和链式存储结构,对线性表的操作包括:初始化,判空,清空,查找元素(返回元素和返回元素位置),插⼊,删除,线性表长度等,今天先放线性表顺序存储结构操作的代码实现,有参考⾼⼀凡⼤师的代码。

2 代码 代码分成三个⽂件,⼀个头⽂件,两个cpp⽂件,sqlist.h头⽂件,实现线性表顺序存储结构,函数的声明,宏定义等,其中⼀个sqlist.cpp⽂件实现对线性表的操作,另⼀个sqlist_main.cpp⽂件实现测试功能。

以下代码在vs2013中亲测有效头⽂件sqlist.h#ifndef _SQLIST_H#define _SQLIST_H#define MAXSIZE 10#define LISTINSREMENT 2#define OK 1#define ERROR 0#define FALSE 0#define TRUE 1typedef int Status;typedef int ElemType;typedef struct{ElemType *elem;int length;//当前长度int listsize;//分配的总⼤⼩(按sizeof(ElemType)的整数倍计)}Sqlist;Status InitList(Sqlist* L);Status DestroyList(Sqlist* L);Status ListEmpty(Sqlist L);Status CleanList(Sqlist* L);int ListLength(Sqlist L);Status ListInsert(Sqlist* L, int i, ElemType e);Status ListDelete(Sqlist* L, int i, ElemType* e);Status GetElem(Sqlist* L, int i, ElemType *e);Status LocateElem(Sqlist L, ElemType e);#endifsqlist.cpp⽂件#include "sqlist.h"#include <iostream>#include <assert.h>using namespace std;/*init sqlist*/Status InitList(Sqlist* L){(*L).elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));assert(NULL != (*L).elem);(*L).length = 0;(*L).listsize = MAXSIZE;return OK;}//destroy listStatus DestroyList(Sqlist* L)free((*L).elem);(*L).elem = NULL;(*L).length = 0;(*L).listsize = 0;return OK;}//list is empty return trueStatus ListEmpty(Sqlist L){if (0 == L.length)return TRUE;elsereturn FALSE;}//clean list//前提:顺序表存在Status CleanList(Sqlist* L){if (NULL != (*L).elem){(*L).length = 0;return OK;}elsereturn ERROR;}//return list lengthint ListLength(Sqlist L){if (NULL != L.elem){return L.length;}elsereturn ERROR;}//insert elem//前提:顺序表存在//1 判断i合法//2 顺序表未满,若满,增加内存分配//3 插⼊时,第i个及之后元素后移//操作结果在第i个前⾯插⼊新元素,长度加1Status ListInsert(Sqlist* L, int i, ElemType e){ElemType *newbase = NULL, *p = NULL, *q = NULL;if (NULL != (*L).elem)//顺序表存在{assert(!(i < 1 || i >(*L).length + 1));// i 不合法if ((*L).listsize <= (*L).length)//分配内存不够{newbase = (ElemType*)realloc((*L).elem, (((*L).listsize + LISTINSREMENT) * sizeof(ElemType))); assert(NULL != newbase);(*L).elem = newbase;(*L).listsize += LISTINSREMENT;}q = (*L).elem + i - 1;//新元素存放位置for (p = (*L).elem + (*L).length - 1; p >= q; p--)//第i个元素后的元素后移⼀位{*(p + 1) = *p;}*q = e;(*L).length++;return OK;}elsereturn ERROR;}//delete elem//前提:顺序表存在//i是否合法//删除第i个位置的元素并返回这个值Status ListDelete(Sqlist* L, int i, ElemType* e){ElemType *p = NULL;if (NULL != (*L).elem)assert(!(i < 1 || i >(*L).length));p = (*L).elem + i - 1;*e = *p;for (p; p < (*L).elem + (*L).length - 1; p++) {*p = *(p + 1);}(*L).length--;return OK;}elsereturn ERROR;}//get elem//前提:顺序表存在//判断i的合法性//获得第i个位置的元素并返回其值Status GetElem(Sqlist* L, int i, ElemType *e) {ElemType *p = NULL;if (NULL != (*L).elem){assert(!(i<1 || i>(*L).length));p = (*L).elem + i - 1;*e = *p;return OK;}elsereturn ERROR;}//find elem//前提:顺序表存在//查找结束后i时候在正确范围内//返回元素在表中的序号Status LocateElem(Sqlist L, ElemType e){int i = 1;if (NULL != L.elem){while (i <= L.length && !(*L.elem++ == e)) i++;return i;/*for (i = 0; i < L.length; i++){if (e == L.elem[i])break;}if(i+1 <= L.length )return i+1;elsereturn ERROR;思路正确,但不够简练*/}elsereturn ERROR;}sqlist_main.cpp⽂件#include "sqlist.h"#include <iostream>#include <assert.h>using namespace std;int main(){Sqlist SL;Status ret;int i = 0;ElemType e;ret = InitList(&SL);cout << "init success,ret is: " << ret << endl;ret = ListEmpty(SL);cout << "return 1 is empty, ret is: " << ret << endl;ret = CleanList(&SL);cout << "return 1 mean clean success, ret is: " << ret << endl;for (i = 1; i < 10; i++){ret = ListInsert(&SL, i, i);//从头到尾插⼊9个数//cout << ret << endl;}ret = ListDelete(&SL, 2, &e);cout << "delete success return 1, ret is " << ret << "e is: " << e << endl; for (i = 0; i < SL.length; i++)//打印{cout << SL.elem[i] << endl;}ret = ListLength(SL);cout << "SL length is: " << ret << endl;ret = GetElem(&SL, 3, &e);cout << "get success return 1, ret is " << ret << "e is: " << e << endl; ret = LocateElem(SL, 4);cout << "e loctation is: " << ret << endl;ret = DestroyList(&SL);cout << "destroy success, ret is: " << ret << endl;system("pause");return 0;} 不当之处请多多指点。

编程实现书p32 adt stack 基本操作9个,用顺序存储结构实现;

编程实现书p32 adt stack 基本操作9个,用顺序存储结构实现;

编程实现书p32adt stack基本操作9个,用顺序存储结构实现;在这里,我将演示如何使用顺序存储结构实现一个基本的栈(Stack)抽象数据类型(ADT),包括栈的初始化、入栈、出栈等基本操作。

以下是一个简单的C语言示例代码:```c#include<stdio.h>#include<stdlib.h>#define MAX_SIZE10//栈的最大容量typedef struct{int data[MAX_SIZE];//用数组存储栈元素int top;//栈顶指针}Stack;//初始化栈void initStack(Stack*stack){stack->top=-1;//栈顶指针初始化为-1,表示空栈}//判断栈是否为空int isEmpty(Stack*stack){return stack->top==-1;}//判断栈是否已满int isFull(Stack*stack){return stack->top==MAX_SIZE-1;}//入栈void push(Stack*stack,int value){if(isFull(stack)){printf("栈已满,无法入栈\n"); return;}stack->top++;stack->data[stack->top]=value;}//出栈int pop(Stack*stack){if(isEmpty(stack)){printf("栈为空,无法出栈\n");return-1;//表示栈空}int value=stack->data[stack->top]; stack->top--;return value;}//获取栈顶元素的值,但不出栈int peek(Stack*stack){if(isEmpty(stack)){printf("栈为空\n");return-1;//表示栈空}return stack->data[stack->top];}//打印栈中的元素void printStack(Stack*stack){if(isEmpty(stack)){printf("栈为空\n");return;}printf("栈中元素:");for(int i=0;i<=stack->top;i++){ printf("%d",stack->data[i]);}printf("\n");}int main(){Stack stack;initStack(&stack);push(&stack,1);push(&stack,2);push(&stack,3);printStack(&stack);printf("栈顶元素:%d\n",peek(&stack)); pop(&stack);printStack(&stack);return0;}```这个例子中,通过结构体`Stack`定义了栈的数据结构,包括一个数组`data`存储元素,和一个`top`指针表示栈顶。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
returnlist_addat(l,l->count,data);
}
/*头部追加*/
boollist_addfirst(LIST l,void*data)
{
returnlist_addat(l,0,data);
}
/*指定位置删除*/
boollist_removeat(LIST l,intindex)
boollist_addfirst(LIST l,void*data);
boollist_addmatch(LIST l,comp_funccomp,void*data,boolord);
boollist_removeat(LIST l,intindex);
boollist_removelast(LIST l);
if(sig==ord)
l->data[j+1]=l->data[j];
else
break;
}
l->data[j+1]=(void*)tmp;
}
returntrue;
}
<test.c>
/* ************************************************
* Name:list.h
free(l->data[i]);
free(l->data);
free(l);
returntrue;
}
/*空间扩展*/
inlinestaticboollist_expand(LIST l){
inti;
l->data=realloc(l->data,sizeof(void*)*(l->loads+STEP_SIZE));
void*list_getat(LIST l,intindex)
{
if(list_empty(l))
returnNULL;
if(index<0||index>=l->count)
returnNULL;
returnl->data[index];
}
/*读取匹配记录*/
void*list_getmatch(LIST l,comp_funccomp,void*data)
for(i=l->count;i>index;i--)
l->data[i]=l->data[i-1];
l->data[index]=(void*)tmp;
memcpy(l->data[index],data,l->elemsize);
l->count++;
returntrue;
}
/*尾部追加*/
boollist_addlast(LIST l,void*data)
}
/*结构初始化*/
LISTlist_init(intelemsize)
{
inti;
/*为结构分配空间*/
LIST l=malloc(sizeof(structlist));
if(l==NULL)
returnNULL;
l->elemsize=elemsize;
/*为指针数组分配空间*/
l->data=malloc(sizeof(void*)*INIT_SIZE);
* ************************************************/
#include<string.h>
#include<stdlib.h>
#include"list.h"
/*结构非空判断*/
inlinestaticboollist_empty(LIST l)
{
return(l->count==0)?true:false;
/*预分配用户数据存储空间*/
for(i=0;i<INIT_SIZE;i++)
l->data[i]=malloc(l->elemsize);
l->count=0;
l->loads=INIT_SIZE;
returnl;
}
/*结构销毁*/
boollist_release(LIST;i<l->count;i++)
returntrue;
}
/*寻找匹配位置追加*/
boollist_addmatch(LIST l,comp_funccomp,void*data,boolord)
{
inti;
boolsig;
if(list_empty(l))
returnlist_addlast(l,data);
for(i=0;i<l->count;i++){
if(a->id==b->id)
return0;
return(a->id>b->id)?1:-1;
}
intcomp_name(void*data1,void*data2)
{
structinfo*a=data1;
structinfo*b=data2;
returnstrcmp(a->name,b->name);
{
returnlist_removeat(l,0);
}
/*结构遍历,并执行指定操作*/
boollist_travel(LIST l,proc_funcproc)
{
inti;
if(list_empty(l))
returnfalse;
for(i=0;i<l->count;i++)
proc(l->data[i]);
{
inti;
boolsig;
if(list_empty(l))
returnfalse;
sig=false;
for(i=0;i<l->count;i++){
if(comp(l->data[i],data)==0)
returnlist_removeat(l,i);
}
returnfalse;
}
/*指定位置读取*/
* Name:list.c
*Desc: ADT(抽象数据类型)线性存储C语言描述
*实现的操作:
*初始化/销毁/指定位置追加/查找符合条件记录
* /指定位置删除/有序表中自动寻找匹配位置追加
* /指定位置读取/按给定条件排序等
* Author & Date: Joshua Chan, 2011/11/17
sig=(comp(l->data[i],data)>0)?true:false;
if(sig==ord)
break;
}
returnlist_addat(l,i,data);
}
/*删除匹配记录*/
boollist_removematch(LIST l,comp_funccomp,void*data)
*Desc: ADT(抽象数据类型)线性存储测试程序
* Author & Date: Joshua Chan, 2011/11/17
* ************************************************/
#include<stdio.h>
#include<string.h>
{
inti,j,*tmp;
boolsig;
if(list_empty(l))
returnfalse;
for(i=1;i<l->count;i++){
tmp=(int*)l->data[i];
for(j=i-1;j>=0;j--){
sig=(comp(l->data[j],tmp)>0)?true:false;
* Name:list.h
*Desc: ADT(抽象数据类型)线性存储C语言描述
*实现的操作:
*初始化/销毁/指定位置追加/查找符合条件记录
* /指定位置删除/有序表中自动寻找匹配位置追加
* /指定位置读取/按给定条件排序等
* Author & Date: Joshua Chan, 2011/11/17
{
inti;
int*tmp;
if(index<0||index>l->count)
returnfalse;
if(l->count==l->loads){
if(list_expand(l)==false)
returnfalse;
}
/*数据后移,为新元素准备位置*/
tmp=(int*)l->data[l->count];
* ************************************************/
#ifndef_LIST_H_
#define_LIST_H_
#include<stdbool.h>
#defineINIT_SIZE4/*指针数组初始化长度*/
#defineSTEP_SIZE2/*指针数组扩展步长*/
typedefint(*comp_func)(void*,void*);/*比较函数原型*/
typedefvoid(*proc_func)(void*);/*方法函数原型*/
/*结构定义*/
typedefstructlist{
void**data;/*指针数组*/
相关文档
最新文档