• 单链表的反转


    分数 5

    作者 李卫明

    单位 杭州电子科技大学

    1.3 在第1题( 编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。)建立2个单链表基础上,设计和实现就地逆置单链表函数,即利用原单链表结点建立元素次序相反的单链表。编写程序,建立2个单链表,就地逆置这2个单链表,显示逆置前后的各单链表。注意不可存在内存泄漏。

    输入格式:

    若干整数。

    输出格式:

    每个单链表输出占一行,元素间用分隔符分隔;两个初始单链表和两个就地逆置后单链表,4个单链表,共4行。

    输入样例:

    100 2 3 -2 -8 -6 -9 -10 50 2 -1
    

    输出样例:

    1. 2->2->3->50->100
    2. -10->-9->-8->-6->-2->-1
    3. 100->50->3->2->2
    4. -1->-2->-6->-8->-9->-10

    代码长度限制

    16 KB

    时间限制

    400 ms

    内存限制

    64 MB

    栈限制

    8192 KB

    C程序如下:

    1. printf("%d", p->Data); //先输出数据
    2. p = p->Next; //再指向下一结点
    3. if (p) printf("->"); //若不为空则输出“->”
    4. }
    5. printf("\n"); //换行
    6. }
    7. void Destroy(List L) {
    8. List p = L;
    9. while (p->Next) { //先删除头结点后的所有结点
    10. List q = p->Next;
    11. p->Next = q->Next;
    12. free(q);
    13. }
    14. free(p); //最后删除头结点
    15. }
    16. void Sort(List L) {//选择排序
    17. List pStar, pcur,pMin;
    18. pStar = L->Next;//指向第一有效结点
    19. int temp;
    20. for (;pStar != NULL;pStar = pStar->Next) {//外循环,遍历整个单链表
    21. pMin = pStar;//假设最小值为pStar
    22. for (pcur = pMin->Next;pcur != NULL; pcur = pcur->Next) {//内循环找出包括pStar及之后的最小值
    23. if (pcur->Data < pMin->Data) {
    24. pMin = pcur;//找到更小值则将其地址赋值给pMin
    25. }
    26. }
    27. if (pStar != pMin) {//若最小值与假设的不一致,则交换数据。不改变链接关系
    28. temp = pMin->Data;
    29. pMin->Data = pStar->Data;
    30. pStar->Data = temp;
    31. }
    32. }
    33. }
    34. void Reverse(List L){//单链表的反转
    35. List pHead = NULL;//反装后的头结点
    36. List pCur = L->Next;//待反转的结点
    37. List pNext = NULL;//待反转结点的下一结点,防止找不到要反转的结点,因为反转过程中会不断出现连个分开的单链表
    38. while(pCur!=NULL){//要反转的结点为空时则退出循环
    39. pNext = pCur->Next;//待反转结点的下一结点
    40. pCur->Next = pHead;//反转该结点,改变其指向关系
    41. pHead = pCur;//更新头结点的位置
    42. pCur = pNext;//更新待反转结点
    43. }
    44. L->Next = pHead;//最终的头结点即为pHead,将原来头结点的地址赋值为pHead
    45. }
    46. /*
    47. void Reverse(List L) {//单链表的原地反转
    48. if(L==NULL){
    49. return;
    50. }
    51. List pstar = L->Next;
    52. List pend = pstar->Next;
    53. while (pend) {
    54. pstar->Next = pend->Next;//链接链表防止锻链
    55. pend->Next = L->Next;//调转
    56. L->Next = pend;//接
    57. pend = pstar->Next;//指针移动
    58. }
    59. }*/
  • 相关阅读:
    推荐大家一个比较好用的接口测试工具
    Bash中的变量引用:单引号和双引号的差异
    【GIT问题解决】---- 在【.gitignore】中添加了忽略文件或文件夹后不生效
    【重识云原生】第六章容器6.2.2节——K8S架构剖析
    RocketMQ 系列(五)高可用与负载均衡
    Eclipse 工作空间:深入解析与高效使用
    腾讯游戏革命:手游内400+AI角色个性化成长,成本削减90%|TodayAI
    设备安全:防火墙总结(1)
    智能运维应用之道,告别企业数字化转型危机
    Modbus通信协议
  • 原文地址:https://blog.csdn.net/2302_80325489/article/details/139784737