编程点滴:ADT抽象数据类型的实现(顺序存储线性表C语言描述)
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的顺序存储和链式存储方式的实现一、需求分析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语言中的实现抽象数据类型(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 表(Abstract Data Type Table)是一种通用的数据结构,在常见的面向对象编程语言中都有其对应的实现,是常用的数据表示方式之一。
ADT 表是一个有序的集合,它的每一项由两部分组成:键和其关联的值,每一项都是一个对,该对由键和其关联的值表示。
ADT表可以根据键确定值,也可以根据值查找对应的键。
ADT表可以用于存储任何键值对,并且支持常见的搜索、插入、删除等操作。
它的实现可以有很多种,具体实现方式可以是哈希表,二叉搜索树,顺序表等。
实现方式
1. 哈希表:这是最常见的实现方式,先对键进行哈希计算,得到一个哈希码;接着通过将哈希码折半,或者以某种形式将哈希码映射到表中,将值和键存储在表中。
优点是快速查找,缺点是容易出现冲突。
2. 二叉搜索树:具有有序性,根据比较大小的规则,将键值对插入到二叉搜索树中。
优点是查找效率高,缺点是插入效率低,而且无法很好的处理较多的重复键值情况。
3. 顺序表:将键值对按照键的大小存入到顺序表中。
优点是插入效率高,缺点是查找效率低。
最佳实现方式
综合以上方式的优缺点,建议采用哈希表的方式实现 ADT表,它的查找效率高,且能够有效解决大量重复键值情况。
同时,还可以采用冲突处理机制,有效解决哈希表出现冲突问题,从而提高查找效率。
线性表的顺序存储(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语言实现

数学与信息技术学院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语⾔实现⽅法。
共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语⾔版)该篇也是复习数据结构总结的,虽然很简单但⽅便以后使⽤。
线性表的顺序存储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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;/*指针数组*/