严蔚敏教授的书,里面用了好多所谓的伪代码,个人不喜欢。好不容易把它们都翻译过来,弄得c不像c,c++不像c++的!就全当时复习数据结构了!
使用的是dc++编译器!tc2.0应该不行,因为用到了很多c++的东西~!
我觉得需要注意的就是那个指向函数的指针最函数参数的问题:
定义和声明的时候用的格式是(函数类型 *)函数名(形参表)
调用的时候什么都不用,直接用函数名
用指针指向的函数的参数应该放在调用它的函数的参数里,
这么说总觉得说不清,自己体会一下就好了!
定义顺序表的代码:
cpp 代码
-
-
-
-
-
-
-
-
-
- #define LIST_INIT_SIZE 10
- #define LISTINCREMENT 2
-
- typedef struct{
- int *elem;
- int lenght;
- int listsize;
- }SqList;
-
- void InitList(SqList &L){
- L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
- if(!L.elem)
- exit(1);
- L.lenght=0;
- L.listsize=LIST_INIT_SIZE;
- }
- void DestroyuList(SqList &L){
- free(L.elem);
- L.elem=NULL;
- L.lenght=0;
- L.listsize=0;
- }
- void ClearList(SqList &L){
- L.lenght=0;
- }
- int ListEmpty(SqList L){
- if(L.lenght==0)
- return 1;
- else
- return 0;
- }
- int ListLength(SqList L){
- return(L.lenght);
- }
- int GetElem(SqList L,int i,int &e){
- if(i<1||i>L.lenght)
- return 0;
- else
- e=*(L.elem+i-1);
- return 1;
- }
- int LocateElem(SqList L,int e,int (*compare)(int,int)){
- int i=1;
- int *p;
- p=L.elem;
- while(i<=L.lenght&&!compare(*p++,e))
- i++;
- if(i<=L.lenght)
- return i;
- else
- return 0;
- }
- int PriorElem(SqList L,int cur_e,int &pre_e){
- int i=2;
- int *p=L.elem+1;
- while(*p!=cur_e&&i<=L.lenght){
- i++;
- p++;
- }
- if(i<=L.lenght){
- pre_e=*--p;
- return 1;
- }
- else
- return 0;
- }
- int NextElem(SqList L,int cur_e,int &next_e){
- int i=1;
- int *p=L.elem;
- while(i
- p++;
- i++;
- }
- if(i
- next_e=*++p;
- return 1;
- }
- else
- return 0;
- }
- int ListInsert(SqList &L,int i,int e){
- int *newbase,*p,*q;
- if(i<1||i>L.lenght+1)
- return 3;
- if(L.lenght>=L.listsize){
- if(!(newbase=(int *)realloc(L.elem,(LISTINCREMENT+L.listsize)*sizeof(int))))
- return 0;
- L.elem=newbase;
- L.listsize+=LISTINCREMENT;
- }
- p=L.elem+i-1;
- for(q=L.elem+L.lenght-1;q>=p;q--)
- *(q+1)=*q;
- *p=e;
- L.lenght++;
- return 1;
- }
- int ListDelete(SqList &L,int i,int &e){
- if(i<1||i>L.lenght)
- return 0;
- int *p,*q;
- p=L.elem+i-1;
- e=*p;
- q=L.elem+L.lenght-1;
- for(;p
- *p=*(p+1);
- }
- L.lenght--;
- return 1;
- }
- void ListTraverse(SqList L,void(*visit)(int)){
- int i=1;
- int *p=L.elem;
- while(i<=L.lenght){
- i++;
- visit(*p++);
- }
- }
- int equal(int x,int y)
- {
- if(x==y)
- return 1;
- else
- return 0;
- }
- void unit(SqList &La,SqList Lb){
- int i,b,La_len;
- La_len=La.lenght;
- for(i=1;i<=Lb.lenght;i++){
- GetElem(Lb,i,b);
- if(!(LocateElem(La,b,equal)))
- ListInsert(La,++La_len,b);
- }
- }
- void unit_sq(SqList &La,SqList Lb){
- int *pa,*pb,i,j;
- for(i=1;i<=Lb.lenght;i++){
- pb=Lb.elem+i-1;
- for(j=1;j<=La.lenght;j++){
- pa=La.elem+j-1;
- if(*pa==*pb)break;
- }
- if(j>=La.lenght)
- *(pa++)=*pb;
- }
- }
- void MergeList(SqList La,SqList Lb,SqList &Lc){
- InitList(Lc);
- int i=1,j=1,ai,bi,k=0;
- while(i<=La.lenght&&j<=Lb.lenght){
- GetElem(La,i,ai);
- GetElem(Lb,j,bi);
- if(ai>=bi)
- ListInsert(Lc,++k,ai);
- else
- ListInsert(Lc,++k,bi);
- }
- while(i<=La.lenght){
- GetElem(La,i,ai);
- ListInsert(Lc,++k,ai);
- }
- while(j<=Lb.lenght){
- GetElem(Lb,j,bi);
- ListInsert(Lc,++k,bi);
- }
- }
- void MergeList_sq(SqList La,SqList Lb,SqList &Lc){
- InitList(Lc);
- Lc.lenght=Lb.lenght+La.lenght;
- Lc.listsize=La.listsize+Lb.listsize;
- Lc.elem=(int *)malloc(Lc.listsize*sizeof(int));
- int *pa,*pb,*pa_end,*pb_end,*pc;
- pa=La.elem;
- pb=Lb.elem;
- pa_end=La.elem+La.lenght-1;
- pb_end=Lb.elem+Lb.lenght-1;
- pc=Lc.elem;
- while(pa<=pa_end&&pb<=pb_end){
- if(*pa>=*pb)
- *pc++=*pb++;
- else
- *pc++=*pb++;
- }
- while(pa<=pa_end){
- *pc++=*pa++;
- }
- while(pb<=pb_end){
- *pc++=*pb++;
- }
- }
验证部分的代码:main.cpp
cpp 代码
- #include<maloc.h></maloc.h>
#include<stdio.h></stdio.h>
#include<stdlib.h></stdlib.h><stdlib.h></stdlib.h>
-
- #include"2.1 Linear_list.h"
-
- void print1(int x){
- printf(".....print1.....\n");
- printf("%d \n",x);
- printf("......End.......\n");
- }
- int compare(int x,int y){
- printf("...compare...\n");
- if(x>y)
- return 1;
- else
- return 0;
- }
- int main(void){
- SqList L;
- int i,c;
- printf("现在开始操作每一个函数\n");
- printf("创建一个顺序表:使用InitList\n");
- InitList(L);
- printf("创建成功! \n");
- printf("使用ListInsert 依次插入数值11 22 33 44 77\n");
- ListInsert(L,1,11);
- ListInsert(L,2,22);
- ListInsert(L,3,33);
- ListInsert(L,4,44);
- ListInsert(L,5,77);
- printf("插入成功,用ListTraverse + print1显示\n");
- ListTraverse(L,print1);
- printf("使用ListDelete函数删除第3个元素\n");
- ListDelete(L,3,c);
- printf("删除了 %d\n",c);
- printf("删除成功,用ListTraverse + print1显示\n");
- ListTraverse(L,print1);
- printf("接下来我们获取第3个元素的数值,使用GetElem\n");
- GetElem(L,3,c);
- printf("第三个数值是 %d\n",c);
- printf("用PriorElem获得它的前驱\n");
- PriorElem(L,c,c);
- printf("前驱是:%d\n",c);
- printf("用NextElem获取那个前驱的后继\n");
- NextElem(L,c,c);
- printf("前驱是 %d\n",c);
- printf("使用LocateElem+commpare找出第一个比55大的序号\n");
- c=LocateElem(L,55,compare);
- printf("是第 %d 个!\n",c);
- printf("最后清空L,用ClearList\n");
- ClearList(L);
- printf("使用ListEmpty检验是否位空\n");
- if(ListEmpty(L))
- printf("为空\n");
- else
- printf("不为空\n");
- printf("销毁表,使用DestroyuList\n");
- DestroyuList(L);
- printf("彻底OK");
- getchar();
- return 1;
- }
- 1.rar (11.4 KB)
- 描述: 源文件
- 下载次数: 26
分享到:
相关推荐
数据结构c语言 顺序表操作 源代码 运行正常
数据结构(C语言版)_代码 数据结构(C语言版)_代码
C语言数据结构实现顺序表的动态申请内存并且合并,代码可以直接使用。
数据结构 顺序表的实现(c语言版)
C语言形式的顺序表结构源代码,但没有界面,仅仅适合学习和实验用
c语言数据结构线性表实验(包括顺序表和链表)
顺序表操作(数据结构C语言版),完整的程序可以下载运行,并附有菜单可以选择要实现的功能
C语言实现 顺序表 Init(初始化) Length(当前结点个数) Add(添加) Insert(插入) Delete(删除) FindByKey(查找返回序号) FindByNum(查找返回元素) ShowAll(显示所有元素)
【数据结构】线性表顺序表(全)测试代码用C语言C++实现动态及静态顺序表的定义、插入、删除 定义线性表节点的结构.pdf
PTA平台数据结构课程顺序表参考答案
数据结构顺序表 C语言代码实现以及realloc的使用
《数据结构》(c语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。学了数据结构后,许多以前写起来很繁杂的代码现在写起来很清晰明了. 本书的前半部分从抽象数据类型的...
数据结构中顺序表的基本结构和操作,包括表的初始化,插入,删除,取元素和销毁。
2.2.2 顺序表中基本操作的实现 20 2.3 线性表的链式表示和实现 24 2.3.1 单链表的定义和表示 24 2.3.2 单链表基本操作的实现 26 2.3.3 循环链表 31 2.3.4 双向链表 32 2.4 线性表的应用 34 2.4.1 ...
数据结构—刘小晶—例2.7——用顺序表结构写的学生成绩管理系统
计算机软件技术基础中的数据结构,包括,顺序表,链表,栈,对列,二叉树,排序,查找等思想的c语言实现。文档的内容则是对于各个程序内部算法结构的刻画以及数据输入要求。