注册 登录
编程论坛 数据结构与算法

数据结构C程序

Antigloss 发布于 2004-12-30 21:15, 33802 次点击

在重新学数据结构~我会把我写的源代码发上来~希望大家能提出改进意见~谢谢~注释我写得很详细~就算初学者应该也可以看懂~希望能和大家一起讨论~用VC的话,双击main.dsw即可。如果用tc的话,dos下输入tcc main.c functions.c,然后回车即可。 打包下载~~ [attach]1797[/attach]

1. 顺序表的创建和操作

如果用tc的话,dos下输入tcc main.c functions.c,然后回车即可。

definition.h ============================= #define INITSIZE 100 //顺序表初始空间分配量 #define INCREMENT 10 //顺序表空间分配增量

typedef char ElemType; //定义ElemType代表的数据类型

unsigned short listlen; //全局变量,用于记录目前一共有多少个顺序表

//定义顺序表结构 typedef struct{ ElemType *elem; //存储空间基址 unsigned int length; //当前长度 unsigned int listsize; //当前空间分配量 unsigned int e; //用于记录元素编号 }Sqlist;

short Menu(); //打印菜单,请用户选择 short InitList(Sqlist *); //创建顺序表 short InputList(Sqlist *); //插入数据 short DelList(Sqlist *); //删除数据 short Union(Sqlist *); //求顺序表并集 short Purge(Sqlist *); //删除表中重复元素 short Purge2(Sqlist *); //删除表中重复元素 short Bubble(Sqlist *); //冒泡排序 short Compare(Sqlist *); //比较两个顺序表的大小 short Exchange(Sqlist *); //前N个元素和后M个元素互换 short Location(Sqlist *, ElemType); //求元素位置 void Disp(Sqlist *); //显示顺序表信息 void Three(Sqlist *, unsigned, unsigned); //三次逆转法 short Realloc(Sqlist *); //增加空间 ====================================================

main.c =========================== #include<stdio.h> #include<stdlib.h> #include"definition.h"

int main() { Sqlist L[10]; //最多可以建立10个顺序表 unsigned int i; unsigned short choice; //记录用户选择的操作 short (*option[])(Sqlist *)={InitList, InputList, DelList, Union, Purge, Bubble, Compare, Exchange, Purge2}; //定义函数指针

listlen=0;//初始化顺序表数目

printf("请输入1创建一个顺序表。最多可以创建10个顺序表\n");

while( (choice=Menu())!='q'-49 ){//根据用户输入选择函数运行 i=0; if(choice==0) InitList(&L[listlen]); //插入数据 else if(choice==3) Union(L); //合并顺序表 else if(choice==6) Compare(L); //比较顺序表 else{ while(i>listlen || i<1){ //如果用户输入不合法,则循环请用户输入 printf("请问您要对哪个顺序表(1 — %d)进行操作:", listlen); scanf("%d", &i); } getchar();//用于接收多余的字符'\n' option[choice](&L[i-1]); }

//打印顺序表的内容 Disp(L); }

for(i=0; i<listlen; i++) free(L[i].elem); //释放内存 return 0; //退出程序 } ===================================================

functions.c ========================= #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include"definition.h"

short Menu() //打印菜单,并且接受用户输入的操作 { char ch='0';

do{ if( strchr("23456789", ch) ) printf("您还没有建立顺序表呢,请输入1建立一个顺序表。\n");

printf("\n"); printf("********************************\n"); printf("*** 请选择您要进行的操作 ***\n"); printf("********************************\n"); printf("* 1. 创建顺序表 *\n"); printf("* 2. 插入数据 *\n"); printf("* 3. 删除数据 *\n"); printf("* 4. 求顺序表并集 *\n"); printf("* 5. 删除重复元素 *\n"); printf("* 6. 冒泡排序 *\n"); printf("* 7. 比较顺序表大小 *\n"); printf("* 8. 前N个元素和后M个元素互换 *\n"); printf("* 9. 删除重复元素(2) *\n"); printf("* q. 退出 *\n"); printf("********************************\n"); printf("\n");

ch=getch();//getch()并不在屏幕上输出 }while( !strchr("123456789q", ch) || (listlen==0 && strchr("23456789", ch)) );//如果在ch不存在于""之间,则循环请用户输入操作号

return ch-49;//返回操作号 }

short InitList(Sqlist *L)//创建顺序表 { if(listlen==10){ //当前已经有了10个顺序表 printf("最多只能创建10个顺序表。\n"); return 0; }

L->elem=(ElemType *)malloc(INITSIZE*sizeof(ElemType));//分配空间 if(!L->elem){ printf("Not Enough Memory!\n"); return 1;//创建失败返回1 }

//创建成功,初始化顺序表长度和字符串长度 L->length=0; L->listsize=INITSIZE; L->e=0; //初始化元素编号 listlen++; //更新顺序表数目

printf("顺序表创建成功!您可以开始对顺序表进行操作了。\n"); return 0;//创建成功返回0 }

short InputList(Sqlist *L)//接受用户输入的字符串 { unsigned int i; ElemType temp; //用于暂时存储用户输入的字符 if(L->length){ //如果顺序表中存在数据 L->e=L->length+1; while(L->e > L->length || L->e < 0){//如果用户输入不合法,则循环请用户输入 printf("请输入插入位置(0 — %d),0代表插入到最后:", L->length); scanf("%d", &L->e); } getchar();//用于接收多余的字符'\n' } printf("请输入字符串:"); if(!L->e){//如果顺序表中不存在数据,或者用户前面输入为0 L->e=L->length;//从第length个位置开始插入字符。如果顺序表中不存在数据,此时length等于0 for(; ( L->elem[L->e]=getchar() )!='\n'; L->e++){//循环插入数据 L->length++; if(L->length==L->listsize){//如果顺序表已满 if( Realloc(L) ) //增加空间 return 1;//增加空间失败,退出 } } } else{//如果顺序表不空,而且用户前面输入不是0 L->e--; for(; (temp=getchar())!='\n'; L->e++, L->length++){//从第e个位置开始,循环插入数据 if(L->length==L->listsize){//如果顺序表已满 if( Realloc(L) ) //增加空间 return 1;//增加空间失败,退出 }

i=L->length; for(; i > L->e; i--){ L->elem[i]=L->elem[i-1];//将第e个位置开始的元素都向后移动一个位置 } L->elem[L->e]=temp;//将用户输入的字符插入第e个位置 } }

return 0;//返回 }

short DelList(Sqlist *L) { unsigned int i, j;

if(!L->length){ //如果顺序表中没有数据,退出 printf("\n该顺序表里没有数据。\n"); return 1; } //如果顺序表中存在数据 L->e=L->length+1; while(L->e > L->length || L->e < 1){//如果用户输入不合法,则循环请用户输入 printf("请输入删除位置(1 — %d):", L->length); scanf("%d", &L->e); } i=L->length+1; j=L->length - L->e + 1; while( i<1 || i>j ){//如果用户输入不合法,则循环请用户输入 printf("请输入删除数目(1 — %d):", j ); scanf("%d", &i); } getchar();//用于接收多余的字符'\n' //开始删除数据 if(i==j) ; else for( j=i+(--L->e); j<L->length; L->e++, j++ ){ L->elem[L->e]=L->elem[j]; } L->length-=i;//更新字符串长度

return 0;//返回 }

short Union(Sqlist *L){ //求顺序表并集 unsigned short i=0, j=0; unsigned k;

if(listlen<2){//如果少于两个顺序表,则返回1 printf("至少要有两个顺序表才能进行并集操作,请再建立一个顺序表。\n"); return 1; }

while( i<1||j<1||i>listlen||j>listlen||i==j){//如果用户输入不合法,则循环请用户输入 printf("\n请输入您想要进行并集操作的两个顺序表,两个数字之间用空格隔开(1 — %d):", listlen); scanf("%d %d", &i, &j); }

//开始进行并集操作 for(i--, j--, k=0; k<L[j].length; k++){ if( !Location(&L[i], L[j].elem[k]) ){//在顺序表i中找不到顺序表j中的第k+1个元素,将第k+1个元素插入顺序表i if(L[i].length==L[i].listsize){ //如果顺序表已满 if( Realloc(&L[i]) ){ //增加空间 printf("\n没有足够的内存用于完成并集操作。\n"); return 1;//增加空间失败,退出 } } L[i].elem[L[i].length]=L[j].elem[k];//插入到表i L[i].length++;//表i长度增加 } } printf("\n并集操作完成。操作结果保存于顺序表 %d 。\n", ++i);

return 0;//无误返回 }

short Purge(Sqlist *L) //删除表中重复元素 { unsigned i, j, k;

for(i=0; i<L->length; i++){ for(j=i+1; j<L->length;){ if(L->elem[i]==L->elem[j]){//若找到重复元素 for(k=j; k<L->length; k++)//删除重复元素 L->elem[k]=L->elem[k+1]; L->length--;//顺序表长度减1 } else j++; } }

printf("\n重复数据已经删除完毕。\n"); return 0; }

short Purge2(Sqlist *L) //删除表中重复元素 { Sqlist T=*L; unsigned i;

T.length=1; for(i=1; i<L->length; i++){ if( !Location(&T, L->elem[i]) ){//若找不到重复元素 T.elem[T.length]=L->elem[i];//插入 T.length++;//更新长度 } } L->length=T.length;//更新长度

printf("\n重复数据已经删除完毕。"); return 0; }

short Bubble(Sqlist *L) { char ch='2'; ElemType temp; unsigned i, j, k=L->length-1; unsigned short l;

while( !strchr("01", ch) ){//如果用户输入不合法,则循环请用户输入 printf("\n请问您要进行降序排序还是升序排序?0代表降序,1代表升序。\n"); ch=getch(); }

if(ch=='0'){ for(l=1; l; k--){ l=0; for(i=0, j=1; i<k; i++, j++){//降序排列 if(L->elem[i] < L->elem[j]){ temp=L->elem[i]; L->elem[i]=L->elem[j]; L->elem[j]=temp; l=1; } } } } else{ for(l=1; l; k--){ l=0; for(i=0, j=1; i<k; i++, j++){//升序排列 if(L->elem[i] > L->elem[j]){ temp=L->elem[i]; L->elem[i]=L->elem[j]; L->elem[j]=temp; l=1; } } } } printf("\n排序完成。\n"); return 0; }

short Compare(Sqlist *L)//比较两个顺序表 { unsigned short i=0, j=0; unsigned k;

if(listlen<2){//如果少于两个顺序表,则返回1 printf("至少要有两个顺序表才能进行比较,请再建立一个顺序表。\n"); return 1; }

while( i<1||j<1||i>listlen||j>listlen||i==j){//如果用户输入不合法,则循环请用户输入 printf("\n请输入您想要比较的两个顺序表,两个数字之间用空格隔开(1 — %d):", listlen); scanf("%d %d", &i, &j); }

//开始进行比较 for(i--, j--, k=0; k<L[i].length && k<L[j].length; k++){ if(L[i].elem[k] > L[j].elem[k]){ printf("\n顺序表 %d 比顺序表 %d 大。\n", ++i, ++j); return 1; } if(L[i].elem[k] < L[j].elem[k]){ printf("\n顺序表 %d 比顺序表 %d 大。\n", ++j, ++i); return 2; } }

if(L[i].length > L[j].length){ printf("\n顺序表 %d 比顺序表 %d 大。\n", ++i, ++j); return 1; } if(L[i].length < L[j].length){ printf("\n顺序表 %d 比顺序表 %d 大。\n", ++j, ++i); return 2; }

printf("\n两表相等。\n"); return 0;//相等返回0 }

short Exchange(Sqlist *L) //前N个元素和后M个元素互换 { unsigned i=0;

while(i<1 || i>=L->length){//如果用户输入不合法,则循环请用户输入 printf("\n请输如互换点(1 — %d):", L->length-1); scanf("%d", &i); }

//三次逆转 Three(L, 0, i-1); Three(L, i, L->length-1); Three(L, 0, L->length-1);

printf("\n互换完成。\n"); return 0; }

void Three(Sqlist *L, unsigned i, unsigned j)//三次逆转法 { ElemType temp;

for(; i<j; i++, j--){ temp=L->elem[i]; L->elem[i]=L->elem[j]; L->elem[j]=temp; } }

short Location(Sqlist *L, ElemType elem)//求元素位置 { unsigned l;

for(l=0; l < L->length && L->elem[l]!=elem; l++) ; if(l==L->length)//在顺序表中找不到elem return 0; //返回0

return ++l;//找到则返回元素位置 }

short Realloc(Sqlist *L)//增加空间 { ElemType *newbase;

newbase=(ElemType *)realloc(L->elem, (L->listsize+INCREMENT)*sizeof(ElemType) );//增加空间 if(!newbase){//如果分配失败 printf("Not Enough Memory!\n"); return 1;//返回1 } //如果分配成功 L->elem=newbase;//将指针指向新分配好的空间 L->listsize+=INCREMENT;//增大listsize的值

return 0;//返回 }

void Disp(Sqlist *L) //显示顺序表信息 { unsigned short i; unsigned j;

printf("\n当前一共有 %d 个顺序表。每个表的数据如下:\n", listlen); for(i=0; i<listlen; i++){ printf("\n顺序表 %d :", i+1); for(j=0; j<L[i].length; j++) printf("%c", L[i].elem[j]); printf("\n字符串长度:%d 顺序表长度:%d", L[i].length, L[i].listsize); printf("\n"); } }

[此贴子已经被作者于2005-4-17 9:17:06编辑过]

90 回复
#52
chrisnk2006-07-09 22:59

顶一个 支持 楼主~~

#53
youngky2006-08-23 09:12
强啊,谢谢楼主给我们这么多资源
#54
mabaoqing2006-08-27 15:45

太强了

支持你

#55
z1089799792006-08-27 23:00
#56
carencpp2006-09-05 18:01
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddd ddddddddddddddddd ddddddddddddd
ddddddddddddddddd ddddddddddddddddddddddddddddddd ddddddddddddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddddddd dddddddddddddddddddddddddd
ddddddddddddddddd ddddddddddddddddddddddddddddd ddddddddddddddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddddd dddddddddddddddddddddddddddd
ddddddddddddddddd ddddddddddddddddddddddddddd d dddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddd dd ddd ddd dddddddddddddddd
ddddddddddddddddd ddddddddddddddddddddddddd ddd ddd ddd dddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddddddd ddd ddd dddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddddddd ddd ddd dddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddddddd ddd ddd dddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddddddd d dd d dddddddddddddddd
ddddddddddddddddd dddddddddddddddddddddddddddddddd dddd dddddddddddddddddd
ddddddddddd dddd ddddddddddddddddddddddddddddddd dddddd ddddddddddddddddd
ddddddddddddd dd dddddddddddddddddddddddddddddd dddddddd dddddddddddddddd
ddddddddddddddd ddddddddddddddddddddddddddddd dddddddddd ddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
#57
loveszc2006-09-16 01:05
太好了.太感谢了哈.
#58
wo_qwq2006-09-19 15:53
谢谢楼主 啊,但是我现在还不知道数据结构到底怎么编啊!!
我也不知道你的一个例如!链表的程序是不是写到一个程序中就可以了!!
那个defintion.h是什么 意思??
能帮我解决吗????
#59
adim2006-10-30 08:57
是不是真的。来个实例怎么样!?
#60
yukilx2006-11-05 13:00
#61
wodemingzi2006-11-07 11:07

各位高人可不可以帮一下忙,用C语言版数据结构编写一个程序描述两个多 项式相加,谢谢了
最好尽快,我非常的需要

#62
wodemingzi2006-11-07 11:09
拜托了,各位前辈
#63
123bingbing2006-11-07 13:46

厉害呀。

#64
hsk882006-11-11 22:29
好!
#65
yushan5202006-11-24 12:28
十分感谢,在此谢谢了!
#66
wangdong10272007-01-20 20:23

好东东,谢谢拉,不过有人愿意探讨一下数据结构的问题的话,
我愿意提供帮助,数据结构群:16373977

#67
liuyang07392007-04-01 12:58
为什么你们写的程序编译的时候老是 出错了!1
#68
caoren1a2007-04-07 13:59

hao

#69
阿兴2007-04-10 19:11
回复:(Antigloss)线索二叉树definition.h=======...
楼主可以帮我写一段程序吗?
1.写创建一个链表的全过程,就是数据结构上面的创建一个连表,你写完了,要求可以在TC上调试出来,要出结果.
2.写一段程序:表达试求解.
就是数据结构上面的,也要求在TC上可以调试出结果

我很需要,谢谢了.
#70
wu07202007-04-11 14:00
        太帅了
#71
kehnoye2007-04-13 10:17

正需要呢谢谢

#72
daixiao122007-04-18 17:17

楼主 强人一个 顶了

#73
fangfangff2007-05-23 16:37
这么好的东西,不顶真是对不起楼主啊!!
顶起!!!!!!
#74
清清20052007-05-28 21:11
你太厉害了,偶像啊.
可以帮我一个帮吗?非常紧急的,就是下面你看到的题目,大家都来看看吧,谢谢了,
我的电子邮件是huqingqingziru@163.com

猴子吃桃子问题
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求:
采用数组数据结构实现上述求解
采用链数据结构实现上述求解
采用递归实现上述求解
#75
killer_l2007-05-30 09:08
支持.......
#76
ibiancheng2007-10-09 21:11
太感谢LZ了!
#77
2007-10-14 13:21
好厉害;
#78
qxyaizzc2007-11-22 16:36
本相借来一用可怎么有错误呢
#79
skycdut2007-12-09 10:18
hao
#80
4612052992007-12-10 18:22
#81
liuyuanwai2007-12-11 11:42
强~~好像格式很乱啊
不过支持~~
#82
huoshanzhidian2008-06-15 11:03
很好
#83
2008-06-15 21:05
太乱了,不想看了!
#84
chen880620072008-06-16 11:57
有没有
电梯模拟 的程序
发给我
121979022@
#85
yingwufenghua2008-10-25 01:22
有点乱~~~
#86
geyinglong2010-03-14 14:13
比较全面了
#87
linqingwudi2010-09-30 15:08
#88
lidonghaha2012-10-23 15:45
看的我头晕==
#89
lidonghaha2012-10-23 15:51
好用好用啊~~~爽~~~
#90
nuistkevin2013-04-15 12:36
猎头职位-软件工程师
岗位职责
1.与世界顶尖的软件工程师共同开发虚拟化云计算产品
2.能独立处理和解决所负责的任务;
3.进行程序单元、功能的测试,查出软件存在的缺陷并保证其质量。
任职资格
1、 211或985高校计算机科学与技术或软件专业,英文流利;
2、 具有很强的学习能力和解决问题的能力;
3、 至少3年以上软件开发经验,精通C语言/C++,热衷于技术专研;
4、 熟练的数据结构知识体系与较强的算法能力,对堆栈、2X树、多X树有一定了解
5、 熟悉Windows, Linux X86/64 操作系统;
6、 熟悉Network configurations and environments;

工作地点:上海
有意者可以发送您的中英文简历至邮箱:
junpingwu@
QQ:2571168815
#91
y12074358812013-05-02 00:29
不错
12