鱼C论坛

 找回密码
 立即注册
查看: 4898|回复: 8

这么牛逼的程序在哪出了错?

[复制链接]
发表于 2011-12-25 12:11:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 研学会 于 2011-12-25 15:42 编辑
  1. /*
  2. 程序规范总结:
  3. 1.为了程序的简单易读,能用能分开写尽量分开写return(一长串)的存在;
  4. 2.摒弃temp除非只采用一次;
  5. 3.if后若只有一个语句,建议还是加上{},以防写习惯,检查错误后,编译器检查不出;
  6. 4.for{}或if{}后不加分号;
  7. */
  8. /*
  9. 本程序
  10. 优点:节约了内存空间
  11. 缺点:算法效率不高,因为二次初始化和判断函数要执行
  12. 该进:可以将线性表的初始长度设置得大一点
  13. */
  14. #include <stdio.h>
  15. #include <stdlib.h>//本库包含exit()函数
  16. /***************************************用结构体定义线性表***********************************************/

  17. typedef int ElemType;//定义元素
  18. typedef struct list//注:结构体名list可不写
  19. {
  20. ElemType *elem;//定义元素类型
  21. int listsize;//线性表容量
  22. int length;//线性表当前长度
  23. }Sqlist;//用typdef将list定义为Sqlist,若过这样的话为什么不直接就将结构体名定义为Sqlist ????????????????????????????

  24. /****************************************本程序所用函数声明******************************************/

  25. void Initlist1Sq(Sqlist **,Sqlist *);//初始化函数
  26. void Creat_sq(Sqlist **,Sqlist *);//创建线性表函数
  27. void Insert_sq(Sqlist **,Sqlist *,int,ElemType);//插入函数
  28. void Panduan(Sqlist **,Sqlist *,int);//判断函数
  29. void Initlist2Sq(Sqlist **,Sqlist *);//二次初始化函数
  30. void Display_sq(Sqlist **);//遍历线性表函数
  31. void SearcByElem(Sqlist **,ElemType);//按值查找函数
  32. void SearchByNum(Sqlist **,int);//按序号查找函数
  33. int DeleteByPos(Sqlist **,int);//按值删除函数
  34. void DeleteByElem(Sqlist **,ElemType);//按序号删除函数
  35. void Printf(void);//打印操作提示符函数

  36. /*******************************************主函数实现*************************************************/

  37. int main(void)//本主函数返回值用int(整型)只为实现输入提示X时能中止整个函数
  38. {
  39. int pos;//pose在按序号删除,查找时接收输入
  40. char cmd;//用cmd接收输入的提示符
  41. ElemType temp;//temp在按元素删除,查找时接收输入
  42. Sqlist L;//定义了线性表
  43. Sqlist *Lp;//指针用于存放L的地址
  44. Sqlist **Lpp;//双指针因为在二次初始化时要改变Lp的指向
  45. Sqlist L1;//定义再生表
  46. Sqlist *L1p;
  47. Lp=&L;
  48. Lpp=&Lp;
  49. L1p=&L1;//将再生表的地址赋给L1p指针
  50. Initlist1Sq(Lpp,L1p);//初始化放在前面,因为应用必须要初始化之后,所以这是不可忽略的步骤,不能让用户自己选择
  51. Printf();//输出提示符: P=遍历,I=插入,S=元素查找,s=序号查找,D=元素删除,d=序号删除,X=退出
  52. while(1)//实现程序的重用
  53. {
  54. cmd=getchar();//用getchar接受Printf命令
  55. switch(cmd)
  56. {

  57. case 'I'://I:插入函数Insert_sq的缩写
  58. case 'i':
  59. printf("输入要插元素:");
  60. scanf("%d",&temp);
  61. printf("输入要插位置:");
  62. scanf("%d",&pos);
  63. Insert_sq(Lpp,L1p,pos,temp);
  64. printf("\n");
  65. Display_sq(Lpp);
  66. Printf();
  67. break;

  68. case 'S'://S:元素查找函数SearcByElem的缩写
  69. printf("输入要查元素:");
  70. scanf("%d",&temp);
  71. SearcByElem(Lpp,temp);
  72. printf("\n");
  73. Display_sq(Lpp);
  74. Printf();
  75. break;

  76. case 's'://s:序号查找函数SearchByNum的缩写
  77. printf("输入要查序号:");
  78. scanf("%d",&pos);
  79. SearchByNum(Lpp,pos);
  80. printf("\n");
  81. Display_sq(Lpp);
  82. Printf();
  83. break;

  84. case 'D'://D:元素删除函数DeleteByElem的缩写
  85. printf("输入要删除的元素:");
  86. scanf("%d",&temp);
  87. DeleteByElem(Lpp,temp);
  88. printf("\n");
  89. Display_sq(Lpp);
  90. Printf();
  91. break;

  92. case 'd'://d:序号删除函数DeleteByPos的缩写
  93. printf("输入删除的序号:");
  94. scanf("%d",&pos);
  95. DeleteByPos(Lpp,pos);
  96. printf("\n");
  97. Display_sq(Lpp);
  98. Printf();
  99. break;

  100. case 'X':
  101. case 'x':
  102. free(L.elem);
  103. return 1;

  104. default:break;
  105. }
  106. }
  107. return 1;
  108. }

  109. /****************************************提示函数********************************************************/

  110. void Printf(void)
  111. {
  112. printf("\n\nI=插入,S=元素查找,s=序号查找,D=元素删除,d=序号删除,X=退出\n");
  113. }

  114. /***************************************初始化线性表*******************************************************/

  115. void Initlist1Sq(Sqlist **L,Sqlist * L1p)
  116. {
  117. ElemType MAXSIZE=3;//默认开辟是3个元素的空间
  118. (*L)->elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));//为表中元素开辟MAXSIZE个长度ElemType的连续内存,并将首地址发送给(*L)->elem
  119. if(!(*L)->elem)//判断内存开辟是否成功
  120. {
  121. printf("警告:内存分配出错,尝试重新运行程序!");
  122. exit(0);//终止整个程序!
  123. }
  124. (*L)->length=0;//初始化当前长度
  125. (*L)->listsize=MAXSIZE;//初始化表容量
  126. Creat_sq(L,L1p);
  127. }

  128. /****************************************创建线性表*******************************************************/

  129. void Creat_sq(Sqlist **L,Sqlist * L1p)
  130. {
  131. int i=0;
  132. char cd;
  133. ElemType temp;
  134. printf("元素之间用空格符隔开,!表示确定输入,例如:1 2 3! \n");
  135. printf("输入元素:");
  136. do
  137. {
  138. scanf("%d",&temp);
  139. i++;
  140. Insert_sq(L,L1p,i,temp);//插入函数:在第i个位置添加元素temp
  141. cd=getchar();
  142. }while(cd!='!');//这可控制方法过于恶心,怎样实现输入enter就行了?????????????????????????
  143. Display_sq(L);
  144. }

  145. /*****************************36********插入元素操作********************************************************/

  146. void Insert_sq(Sqlist **L,Sqlist * L1p,int pos,ElemType x)
  147. {
  148. int i;
  149. if(pos<1||pos>(*L)->length+1)//判断插入位置是否合法(很明显位置不能小于1,不能大于当前长度+1)
  150. {
  151. printf("(%d)是错误位置!\n",pos);
  152. return ;
  153. }
  154. Panduan(L,L1p,pos);
  155. for(i=(*L)->length;i>pos-2;i--)//给i赋值当前表长度
  156. {
  157. *((*L)->elem+i+1)=*((*L)->elem+i);//把指定位置pos-2后的元素往后移动一个位置,恰好在pos-1处留个空位,插入!
  158. }
  159. *((*L)->elem+pos-1)=x;
  160. (*L)->length++;

  161. }

  162. /******************************************判断函数*************************************************/

  163. void Panduan(Sqlist **L,Sqlist * L1p,int pos)
  164. {
  165. int i=0;
  166. if((*L)->length==(*L)->listsize)//当表中已满,默认再次分配内存,不提示用户
  167. {
  168. Initlist2Sq(L,L1p);
  169. //printf("判断执行正常");
  170. }
  171. }

  172. /*****************************************二次分配内存**********************************************/

  173. void Initlist2Sq(Sqlist **L,Sqlist * L1p)//写本函数的目的只为节约内存空间
  174. {
  175. int i;
  176. ElemType MAXSIZE=3;//默认分配3个元素
  177. L1p->elem=(ElemType *)malloc(((*L)->listsize+MAXSIZE)*sizeof(ElemType));//为再生表中元素开辟连续内存空间,将首地址发送给元素指针
  178. if(!L1p->elem)
  179. {
  180. printf("警告:内存分配出错,请重新运行程序!\n");
  181. exit(0);//开辟不成功?终止整个程序!
  182. }
  183. L1p->length=0;//初始化再生表当前长度
  184. L1p->listsize=((*L)->listsize+MAXSIZE);//初始化再生表容量
  185. for(i=0;i<(*L)->length;i++)//将L表中的元素复制到再生表中
  186. {
  187. *(L1p->elem+i)=*((*L)->elem+i);
  188. L1p->length++;
  189. }
  190. free((*L)->elem);//但凡有机会执行了二次初始化,将原内存表示放掉
  191. (*L)=L1p;
  192. }


  193. /***************************************** 打印线性表*********************************************/

  194. void Display_sq(Sqlist **L)
  195. {
  196. int i=0;
  197. printf("表中元素如下:\n");
  198. do
  199. {
  200. i++;
  201. printf("(%d)\t",i);
  202. }while(i<(*L)->length);
  203. printf("\n");
  204. i=0;
  205. do
  206. {
  207. printf(" %d\t",*((*L)->elem+i));
  208. i++;
  209. }while(i<(*L)->length);
  210. printf("\n");
  211. }

  212. /****************************************** 查找元素*********************************************/
  213. void SearcByElem(Sqlist **L,ElemType x)//功能:查找给定的X元素,并打印序号
  214. {
  215. int i=0;
  216. printf("查到序号如下:\n");
  217. do
  218. {
  219. if(x==*((*L)->elem+i))
  220. {
  221. printf("(%d)\t",i+1);
  222. }
  223. i++;
  224. }while(i<(*L)->length);
  225. printf("\n查找操作完成!\n");
  226. return ;
  227. }

  228. void SearchByNum(Sqlist **L,int n)//功能:查找给定序号的元素,并打印出其值
  229. {
  230. if(n<1||n>(*L)->length)
  231. {
  232. printf("不存在(%d)号元素!\n",n);
  233. printf("查找操作失败!\n");
  234. return;
  235. }
  236. printf("(%d)号元素值: %d\n",n,*((*L)->elem+n-1));
  237. printf("查找操作完成!\n");
  238. return;
  239. }
  240. /*******************************************删除元素************************************/
  241. int DeleteByPos(Sqlist **L,int pos)
  242. {
  243. int i;
  244. i=pos;
  245. if(pos<1||pos>(*L)->length)
  246. {
  247. printf("删除序号(%d)不存在!\n",pos);
  248. printf("删除操作失败!\n");
  249. return 0;
  250. }
  251. do
  252. {
  253. *((*L)->elem+i-1)=*((*L)->elem+i);
  254. i++;
  255. }while(i<(*L)->length);
  256. (*L)->length--;
  257. printf("删除操作成功!\n");
  258. return 1;
  259. }

  260. void DeleteByElem(Sqlist **L,ElemType temp)
  261. {
  262. int i=0;
  263. int j=0;
  264. do{
  265. if(temp==*((*L)->elem+i))
  266. {
  267. printf("(%d)号等值元素删除操作成功!\n",i+1);
  268. do
  269. {
  270. *((*L)->elem+j-1)=*((*L)->elem+j);
  271. j++;
  272. }while(j<(*L)->length);
  273. (*L)->length--;
  274. i--;
  275. }
  276. i++;
  277. }while(i<(*L)->length);
  278. printf("不存在该元素!\n");
  279. printf("删除操作失败!\n");
  280. }





复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-25 12:14:27 | 显示全部楼层
本帖最后由 研学会 于 2011-12-25 12:14 编辑

可以在先COPY下来运行一下
本程序
优点:节约了内存空间
缺点:算法效率不高,因为二次初始化和判断函数要执行
该进:可以将线性表的初始长度设置得大一点
问题是二次初始化时总是不成功!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-25 12:55:50 | 显示全部楼层
好长的代码,看一半头就晕了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-25 15:54:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-12 09:59:30 | 显示全部楼层
运行一下试试看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-14 00:20:42 | 显示全部楼层
看不懂,问问小甲鱼吧或者版主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-26 09:12:47 | 显示全部楼层
你这像数据结构的课程设计呢  代码太长了,看到就头晕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-26 14:40:04 | 显示全部楼层
好长啊 :(:D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-26 15:17:44 | 显示全部楼层
顶一下  看看怎么样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 06:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表