资源描述:
《数据结构实验一-单链表的就地反转》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、《数据结构》实验一报吿学号:机器号姓名:日期:程序名:数据结构与算法实验内容:(一)单链表的就地反转一、目的和要求(需求分析):1、掌握数据的链式存储结构以及链表的建立和操作。2、利川链表的原空间进行链表的反转;(设计一个将输入数据建立成链表、并依次输出链表数据、利用原空间把链表反转的程序。)二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)(1)创建带头结点的链表L。先输入总结点数num,接着输入结点。(2)打印链表L。(3)链表L进行就地反转。运用头插法(4)打印反转后的链表L。三、调试和
2、运行程序过程中产生的问题及采取的措施:(1)给LEN赋值时,先用了“#defineLENsizeof(structLNode);”,出现编译错误“errorC2143:syntaxerror:missing')'before”(C2143:p=(LNode*)malloc(LEN);)0不明白怎么修改,最后用"constintLEN=sizeof(structLNode);”替代。(2)写反转函数的时候,在while循环里,运行“q=p;q->next=head->next;n之后,p->next=NULLo最后,用新的结构体指针r指向要插
3、入的结点p之后的结点解决问题。(3)解决问题(2)后,程序运行到反转最后的结点是出现错误,后来反省发现反转函数while(p){r-r->next;q=p;〃插在头结点后的结点q->next=head->next;head->next=q;P=r;〃P指向下一个要插进去的结点>这需要创建链表最后一个结点需要指向空节点,最后在创建函数结尾加上了P=tnP;0四、源程序及注释:#include#include#includestructLNodefintdata;structLNode*
4、next;};typedefstructLNodeLNode;constintLEN=sizeof(structLNode);〃给LEN赋值为sizeof(structLNode)//创建帶头结点的链表LvoidCreate_L(LNode*head,intnum){LNode*p,*tmp;intdata;printf(HPleaseinputthenode:rT);p=(LNode*)malloc(LEN);if(!p->data)exit(-1);〃判断指针p分配空间是否成功scanf(”%d",&data);head->next=
5、p;p->data=data;p->next=NULL;while(-num){scanf("%d",&data);tmp=(LNode*)malloc(LEN);if(!tmp->data)exit(-1);tmp->data=data;tmp->next=NULL;p->next=tmp;〃当渝的next指向新增的结点p=p->next;〃当前的指针指向next作为新的结点tmp=NULL;}P=tmp;}〃输出链表LvoidPrint_L(LNode*head){LNode*p;p=head->next;while(p-ext){pr
6、intf(,,%d->',,p->data);p=p->next;}printf(”%drT,p・>data);〃用头插法实现带头结点的链表L就地反转voidReversal_L(LNode*head){LNode*p,*q,*r;r=p=head->next;//p表示要插进新链表的结点head->next=NULL;while(p){r=r->next;q=p;//插在头结点后的结点q->next=head->next;head->next=q;p=r;//p指向下一个要插进去的结点}intmain(){intnum;LNode*L;
7、L=(LNode*)malloc(LEN);if(!L->data)exit(-1);printf("Pleaseinputthenumberofnodeyouwant:”);scanf(”%d”,&num);//num代表想输入的结点数Create_L(L,num);//创建带头结点的链表Lprintf("Thelinklisttobereversedis:”);Print_L(L);〃打印原链表Reversal_L(L);〃链表的就地反转printf("Thereversallinklistis:");Print_L
8、(L);〃打卬反转后的链表return0;}五、运行输出结果:Pleaseinputthenunberofnodeyouwant:10Pleaseinputthenode:133