软基上机实验报告顺序表扩展题.docx
《软基上机实验报告顺序表扩展题.docx》由会员分享,可在线阅读,更多相关《软基上机实验报告顺序表扩展题.docx(8页珍藏版)》请在冰豆网上搜索。
软基上机实验报告顺序表扩展题
ex1_2——扩展题:
(1)教材第9题(用顺序表实现)
注意该题中没有提供插入元素的具体位置,要根据元素值大小寻找合适的位置。
(2)(输入一组数建立顺序表),顺序表中包括多个负数,编写算法删除其中所有的负数
本题的特点是优化:
怎样在一轮循环中删除,而不是每删除一个,都把后续元素搬移一次。
ex1_3——扩展题:
输入一组数,建立顺序表,编写算法将整个表的元素全部反序存放——即第一个元素放到最后……。
本题的特点在优化,怎样在原表上,直接实现反序——即不额外使用一张新表。
一、程序代码
Exl_2
#include
#defineMAXNUM20
#definetrue1
#definefalse0
typedefstruct
{
intdata[MAXNUM];
intlength;
}list_type;
/*createalist:
inputdatafromkeyboard,endby-1*/
voidcreatelist(list_type*lp)
{
inti,elem;
lp->length=0;
printf("\npleaseinput10sorteddatasfrommintomaxofthelist(input'end'tostop)\n");
for(i=0;i<10;i++)
{
scanf("%d",&elem);
lp->data[i]=elem;
lp->length++;
}
}
voidshowlist(list_type*lp)
{
inti;
printf("\nThese%drecordsare:
\n",lp->length);
if(lp->length<=0)
{
printf("Nodata!
\n");
return;
}
for(i=0;ilength;i++)
printf("%d",lp->data[i]);
printf("\nlengthofthelistis:
%d",lp->length);
}
intinsertlist(list_type*lp,intnew_elem)
{inti,j;
for(j=lp->length;j!
=0;j--)
if(new_elem<=lp->data[j])
i=j;
for(j=lp->length;j!
=i;j--)
lp->data[j]=lp->data[j-1];
lp->data[i]=new_elem;
lp->length++;
return(true);
}
//删除所有负数的函数(自己编写)
voiddelete_negative(list_type*lp)
{
list_typelist2;
inti,j=0;
list2.length=0;
for(i=0;ilength;i++){
if(l->data[i]>0){
list2.data[j]=lp->data[i];
j++;
list2.length++;
}
}
*lp=list2;}
voidmain()
{
list_typelist;
intdata;
createlist(&list);
showlist(&list);
printf("\ninsert:
Enterdata:
\n");
scanf("%d",&data);
insertlist(&list,data);
printf("\nlistafterinsert:
\n");
showlist(&list);
delete_negative(&list);
printf("\nlistafterdeleteallnegative:
\n");
showlist(&list);
while
(1);
}
Exl_3
#include
#defineMAXNUM200
#definetrue1
#definefalse0
typedefstruct
{
intdata[MAXNUM];
intlength;
}list_type;
/*createalist:
inputdatafromkeyboard,endby-1*/
voidcreatelist(list_type*lp)
{
inti,n,elem;
lp->length=0;
printf("\npleaseinputdatasnum\n");
scanf("%d",&n);
printf("\npleaseinput%ddatasofthelist\n",n);
for(i=0;i{
scanf("%d",&elem);
lp->data[i]=elem;
lp->length++;
}
}
voidshowlist(list_type*lp)
{
inti;
printf("\nThese%drecordsare:
\n",lp->length);
if(lp->length<=0)
{
printf("Nodata!
\n");
return;
}
for(i=0;ilength;i++)
printf("%d",lp->data[i]);
printf("\nlengthofthelistis:
%d",lp->length);
}
voidresortlist(list_type*lp)
{
inti,j,n;
inttemp[200];
n=lp->length;
for(i=0;itemp[i]=lp->data[i];
for(i=0,j=n-1;ilp->data[i]=temp[j];
}
voidmain()
{
list_typelist;
intdata,n;
createlist(&list);
showlist(&list);
resortlist(&list);
printf("\nlistafterresort:
\n");
showlist(&list);
while
(1);
}
二、程序流程说明
Exl_1:
输入10个有序数列,然后再输入一个需要插入的数字,将它插入进去并不改变原来的序列,并且删除其中的所有负数
Exl_2:
创建顺序表-输入一组数据-->反序
三、测试数据
Exl_1
输入:
-6-3-101357917
应输出(上机前自己分析的结果):
1135791317
Exl_2
输入:
12345
应输出(上机前自己分析的结果):
54321
四、上机时遇到的问题
1问题现象:
删除负数的时候只能删除部分,不能够充分的删除完
原因:
储存的负数被删除一个时,当后面还有负数的时候会这个负数会继承被删除负数的位置,而此时指针却往后加一,导致不能检测。
解决办法:
在删除负数的函数里执行了删除操作后i=i-1.
五、实际运行结果
六、小结体会
1.有时候要关注最基础的语法,像scanf(“%d,%d”)如果输入的两个数据中间没有自己手动加“,”的话就会容易出错,应该根据自己的习惯来改变其中的语法。
2.在大一上学习的C语言对于现在的帮助很大,但是有些时候也会造成障碍,像一些不懂的语法问题以及以前养成的不好习惯像