#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define INIT_SIZE 3 //线性表存储空间的初始分配量 #define INCREMENT_SIZE 2 //线性表存储空间分配增量 //以下为函数运行结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 //创建结构 typedef struct STU { char name[20]; int age; int score; }ElemType;//元素类型为结构类型 typedef struct List { ElemType *elem;//存储空间基地址 int length;//当前表长 int size;//分配的空间长度 }List; /****************************************函数声明*****************************************/ int init_list(List*);//构造空线性表(建表) void list_destroy(List*);//销毁一个存在的线性表(销表) int list_empty(List);//判断线性表是否为空(看空) int list_length(List);//返回线性表长度(表长) void get_elem(List,int,ElemType*);//用e返回线性表第i个值(求第i个值) int prior_elem(List,int,ElemType*);//用e返回表中第i个元素的前驱的值(求前驱) int next_elem(List,int,ElemType*);//用e返回表中第i个元素的后继的值(求后继) int locate_elem(List,ElemType,int*,int (*compare)(ElemType,ElemType));//用n返回表中符合条件compare()的第一个元素(判断) void list_traverse(List*,ElemType,void (*visit)(ElemType*,ElemType));//对表中每一个元素调用函数visit()(遍历) void list_clear(List*);//将线性表重置为空表(置空) void put_elem(List*,int,ElemType);//给线性表第i个元素赋值(第i个元素赋值) void list_insert(List*,int,ElemType);//将线性表第i个元素前插入一个元素,值为e(前增一) void list_delete(List*,int);//删除线性表第i个元素后一个元素(后减一) int compare(ElemType,ElemType);//比较用到的函数 void visit(ElemType *,ElemType);//遍历用到的函数 //定义结构初始化操作 /// //初始条件:无 // //功能:构造一个空线性表 // /// int init_list(List* L) { L->elem=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType)); if(!L->elem) { printf("内存分配失败"); exit(OVERFLOW); } L->length=0; L->size=INIT_SIZE; return OK; } /// //初始条件:线性表L已存在 // //功能:销毁线性表 // /// void list_destroy(List* L) { free(L->elem); L->length=0; L->size=0; } //定义引用型操作 /// //初始条件:线性表L已存在 // //功能:判断线性表是否为空 // /// int list_empty(List L) { if(L.length) return FALSE; return TRUE; } /// //初始条件:线性表L已存在 // //功能:返回线性表长度 // /// int list_length(List L) { return L.length; } /// //初始条件:线性表L已存在 // //功能:用e返回表中第i个元素的值 // /// void get_elem(List L,int i,ElemType *e) { if(i<1||i>L.length) printf("该元素不存在!"); else *e=L.elem[i-1]; } /// //初始条件:线性表L已存在 // //功能:用e返回表中第i个元素的 // // 前驱的值 // /// int prior_elem(List L,int i,ElemType *e) { if(i<2||i>L.length) { printf("错误的元素!"); return FALSE; } else { *e=L.elem[i-2]; return TRUE; } } /// //初始条件:线性表L已存在 // //功能:用e返回表中第i个元素的后 // // 继的值 // /// int next_elem(List L,int i,ElemType *e) { if(i<1||i>L.length-1) { printf("错误的元素!"); return FALSE; } else { *e=L.elem[i]; return TRUE; } } /// //初始条件:线性表L已存在 // //功能:用n返回表中符合函数条件 // // compare()的第一个元素 // /// int locate_elem(List L,ElemType example,int *n,int (*compare)(ElemType,ElemType)) { for(int i=0;i<L.length;i++) if(compare(L.elem[i],example)) { *n=i+1; return OK; } printf("没有符合的元素!"); return ERROR; } //定义加工型操作 /// //初始条件:线性表L已存在 // //功能:对表中每一个元素调用函数 // // visit() // /// void list_traverse(List* L,ElemType example,void (*visit)(ElemType*,ElemType)) { for(int i=0;i<L->length;i++) visit(L->elem+i,example); } /// //初始条件:线性表L已存在 // //功能:将线性表重置为空表 // /// void list_clear(List* L) { L->length=0; } /// //初始条件:线性表L已存在 // //功能:给表中第i个元素赋值 // /// void put_elem(List *L,int i,ElemType example) { if(i<=L->length&&i>0) { ElemType *elem=(L->elem+i-1); int j; for(j=0;example.name[j]!='/0';j++) elem->name[j]=example.name[j]; elem->name[j]=example.name[j]; elem->age=example.age; elem->score=example.score; } else printf("找不到该元素!"); } /// //初始条件:线性表L已存在 // //功能:表中第i个元素前增加一个 // // 元素,值为e // /// void list_insert(List *L,int i,ElemType e) { if(i<1||i>L->length) printf("找不到该元素!"); else { ElemType *newbase; if(L->length>=L->size) { newbase=(ElemType*)realloc(L->elem, (L->size+INCREMENT_SIZE)*sizeof(ElemType));//注意内存越界的情况 if(!newbase) { printf("空间分配失败!"); exit(OVERFLOW); } else { L->elem=newbase; L->size+=INCREMENT_SIZE; } } for(int j=L->length;j>=i;j--) L->elem[j]=L->elem[j-1]; L->elem[i-1]=e; L->length++; } } /// //初始条件:线性表L已存在 // //功能:删除表中第i个元素后的一个// // 元素 // /// void list_delete(List *L,int i) { if(i<1||i>L->length-1) printf("找不到该元素!"); else { for(int j=i;j<L->length-1;j++) *(L->elem+j)=*(L->elem+j+1); L->length--; } } //compare比较函数,以判断相等为例 int compare(ElemType elem,ElemType example) { int x=FALSE; int i; for(i=0;example.name[i]!='/0';i++) if(elem.name[i]!=example.name[i]) return x; if(elem.name[i]!=example.name[i]) return x; if((elem.age!=example.age)||(elem.score!=example.score)) return x; x=TRUE; return x; } //visit函数,以加法为例 void visit(ElemType *elem,ElemType example) { int i; for(i=0;example.name[i]!='/0';i++) elem->name[i]=example.name[i]; elem->name[i]=example.name[i]; elem->age=example.age; elem->score=example.score; } /****************************************主函数*******************************************/ void main(void) { //界面设计 printf("*******************************************************************************/n"); printf("/t/t/t线性表(顺序结构)/n"); printf("*******************************************************************************/n/n"); //测试 List L; int i; ElemType key; init_list(&L);//建表 if(list_empty(L)) printf("线性表为空表/n");//看空 scanf("%s",&key.name); scanf("%d %d",&key.age,&key.score); for(i=1;key.name[0]!='0';i++) { L.length++; if(L.length>L.size) { ElemType *newbase; newbase=(ElemType*)realloc(L.elem, (L.size+INCREMENT_SIZE)*sizeof(ElemType)); if(!newbase) { printf("空间分配失败!"); exit(OVERFLOW); } else { L.elem=newbase; L.size+=INCREMENT_SIZE; } } put_elem(&L,i,key);//第i个元素赋值 scanf("%s",&key.name); scanf("%d %d",&key.age,&key.score); } printf("/n%d/n",list_length(L));//求表长 scanf("%d",&i); get_elem(L,i,&key);//求第i个值 printf("/n%s/n%d/n%d",key.name,key.age,key.score); printf("/n"); scanf("%d",&i); if(prior_elem(L,i,&key))//求前驱 printf("/n%s/n%d/n%d",key.name,key.age,key.score); printf("/n"); scanf("%d",&i); if(next_elem(L,i,&key))//求后继 printf("/n%s/n%d/n%d",key.name,key.age,key.score); printf("/n"); scanf("%s",&key.name); scanf("%d %d",&key.age,&key.score); if(locate_elem(L,key,&i,compare)) printf("/n%d/n",i);//返回第一个符合元素 list_traverse(&L,key,visit);//遍历 for(i=0;i<L.length;i++) printf("/n%s/n%d/n%d",(L.elem[i]).name,(L.elem[i]).age,(L.elem[i]).score); printf("/n"); scanf("%d",&i); scanf("%s",&key.name); scanf("%d %d",&key.age,&key.score); list_insert(&L,i,key);//前增一 printf("/n%d/n",list_length(L)); for(i=0;i<L.length;i++) printf("/n%s/n%d/n%d",(L.elem[i]).name,(L.elem[i]).age,(L.elem[i]).score); scanf("%d",&i); list_delete(&L,i);//后减一 printf("/n%d/n",list_length(L)); for(i=0;i<L.length;i++) printf("/n%s/n%d/n%d",(L.elem[i]).name,(L.elem[i]).age,(L.elem[i]).score); list_clear(&L);//置空表 printf("/n%d/n",list_length(L)); list_destroy(&L);//销毁 printf("%d/n%d",L.length,L.size); }