计算机软件技术基础
实验报告
姓名:XXX
班级:XX 0X01 学号:30X05050XX
实验一
线性表:
1、建立单向链表,表长任意; 2、可交互输出单链表中的内容;
3、编写算法计算出自己所建单链表的长度并输出;
4、删除自己所建单链表中的第K个结点,并将剩余结点输出; 5、将单链表倒排,输出结果。 源程序如下:
#include
typedef struct node //链表结构体// {
datatype data; struct node *next; }linklist;
linklist *creatlist() //建立链表// {
1
int x;
linklist *head, *s; head=NULL;
printf(\输入链表数据:\ scanf(\ while(x!=0) {
s=malloc(sizeof(linklist)); //为链表开辟一系列的空间// s->data=x; s->next=head; head=s;
printf(\输入链表数据:\ scanf(\ }
return head; }
void listContent(linklist *h) //输出链表内容// {
linklist *s; s=h;
while(s!=NULL) {
printf(\ s=s->next; } }
int listLong(linklist *h) //计算链表长度// {
int i=0; linklist *s; s=h;
while(s!=NULL) {
i++;
s=s->next; }
return(i); }
void DeleteNode(linklist *h,int k) //删除第K个节点// {
int i=0;
linklist *p,*q; p=h; if(k==1)
2
{
h=h->next; free(p); }
else {
while(i p=p->next; } q->next=p->next; free(p); } } linklist *DaoXu(linklist *h) //逆序排列链表 // { linklist *r,*q,*p; r=h; p=r->next; q=p->next; if(h==NULL) printf(\链表为空\\n\ while(q!=NULL&&h!=NULL) { p->next=r; r=p; p=q; q=q->next; } h->next=NULL; p->next=r; return(p); } main() { int k,x; linklist *h; do { printf(\功能:\\n\ printf(\建立链表\\n\ printf(\输出链表内容;\\n\ 3 printf(\获得链表长度\\n\ printf(\删除第K个节点\\n\ printf(\将链表倒序输出\\n\ printf(\退出\\n\ printf(\请输入功能号:\\n\ scanf(\ if(x<1||x>6) printf(\错误!\\n\ else switch(x) { case 1:h=creatlist();break; case 2:listLong(h);break; case 3:printf(\链表的长度是: %d\ case 4:printf(\请输入要删除的节点:\\n\ scanf(\ DeleteNode(h,k); listContent(h);break; case 5:h=DaoXu(h); listContent(h);break; case 6:exit(0);break; } } while(1); } 运行结果: 4 实验总结:1.在编写倒排链表的程序时,对于循环的计数的控制没有搞好,以致无法得到想要的链表;2.要给一个指针创立空间之后才能调用它,否则会出错。 解决办法:1.通过单步调试程序,调整循环次数,来使循环中的个参数达到自己想要的通过查阅资料,完成对链表程序的实现。在写每一个子函数时,常常会遗漏小的判断条件,比如遗漏了判断是否为空等;还有就是在对指针操作时,有时多加了*,或者分号写成逗号;在调试程序的过程中有很多小的错误或者判断条件错误等。 实验二 在交互方式完成下列任务: 5