鱼C论坛

 找回密码
 立即注册
查看: 2666|回复: 10

[已解决]链表问题求解思路

[复制链接]
发表于 2017-3-16 03:41:20 | 显示全部楼层

回帖奖励 +5 鱼币

自己的理解的有两个方法,希望大家可以一起进步
新手又犯了低级错误,第二个方法一直报错误,检查了半天,结果就是if()判断那里,把 == 写成了 = ,一直是内存错误,好心塞
  1. #pragma once

  2. #include <stdio.h>
  3. #include <iostream>
  4. #define        MAXSIZE        20
  5. #define        WRONG        -1
  6. #define        OK                0
  7. typedef int ElemType;
  8. typedef int Status;//返回结果

  9. using namespace std;

  10. //链式存储线性表,单链表
  11. typedef class LinkNode* MyLinkList;

  12. class LinkNode
  13. {
  14. public:
  15.         ElemType data;
  16.         LinkNode *next;
  17. public:
  18.         LinkNode() :data(0), next(nullptr) {}
  19.         Status ListCreateTail(MyLinkList *list, int length)
  20.         {
  21.                 MyLinkList node, tail;//创建一个临时结点和一个尾结点;

  22.                 //(*list) = (MyLinkList)malloc(sizeof(LinkNode));//给头结点开辟空间;
  23.                 *list = new LinkNode();//同上,给头结点开辟空间;
  24.                 (*list)->data = length;//头结点数据为链表总结点数,不包括头结点;
  25.                 tail = *list;//空链表的头结点即尾结点;
  26.                 for (int i = 0; i < length; i++)
  27.                 {
  28.                         //cout << "第" << i << "个元素" << endl;
  29.                         /*node = (MyLinkList)malloc((sizeof(LinkNode)));
  30.                         node->data = i;
  31.                         node->next = nullptr;*/
  32.                         node = new LinkNode(i);
  33.                         if (node == nullptr)        return        WRONG;

  34.                         tail->next = node;
  35.                         tail = node;
  36.                 }
  37.                 tail->next = nullptr;
  38.                 return OK;
  39.         }
  40.         /*显示链表*/
  41.         Status ListShow(MyLinkList *list)
  42.         {
  43.                 MyLinkList tempNode = *list;
  44.                 if (!tempNode || tempNode->next == nullptr)
  45.                 {
  46.                         cout << "无该链表或者链表为空" << endl;
  47.                         return WRONG;
  48.                 }

  49.                 cout << "链表中数据为:";
  50.                 while (tempNode->next != nullptr)
  51.                 {
  52.                         cout << tempNode->data << " ";
  53.                         tempNode = tempNode->next;
  54.                 }
  55.                 cout << tempNode->data << " ";
  56.                 cout << endl;

  57.                 return OK;
  58.         }
  59.         /*销毁链表*/
  60.         Status ClearLinkList(MyLinkList* list)
  61.         {
  62.                 LinkNode *p,*q;
  63.                 p = (*list)->next;
  64.                 while (p)
  65.                 {
  66.                         q = p->next;
  67.                         delete(p);
  68.                         p = q;
  69.                 }
  70.                 delete(*list);
  71.                 (*list) = nullptr;
  72.                 return OK;
  73.         }

  74.         //方法一:依次向后赋值,相当于赋值一份头结点插入到第一个结点前面,再把最后一个结点删除;
  75.         void MyChangeTest(MyLinkList* list)
  76.         {
  77.                 LinkNode *tempNode;//临时结点
  78.                 LinkNode *head = new LinkNode(**list);//新复制一个头结点

  79.                 (*list)->next = head;//链表指向新的头结点
  80.                 tempNode = head->next;//临时结点赋值
  81.                 if (tempNode->next == nullptr)
  82.                         cout << "空链表" << endl;

  83.                 while (tempNode->next->next!=nullptr)//找倒数第二个结点
  84.                 {
  85.                         tempNode = tempNode->next;
  86.                 }
  87.                 delete(tempNode->next);//删除最后一个结点
  88.                 tempNode->next->next = nullptr;
  89.                 tempNode->next = nullptr;//现在最后一个结点,原倒数第二个结点的next赋空
  90.         }

  91.         //方法二:按照题目要求,依次向后赋值;
  92.         void MyChangeTest2(LinkNode* node,ElemType d)
  93.         {
  94.                 if (node->next == nullptr)//递归条件,当结点下一个指向空的时候返回
  95.                 {
  96.                         node->data = d;//先赋值再返回
  97.                         return;
  98.                 }
  99.                 ElemType tempData = node->data;//保存当前结点的数据,用来传给下一个结点
  100.                 node->data = d;//当前结点赋值上一个结点传过来的值
  101.                 MyChangeTest2((node->next), tempData);//递归
  102.         }
  103. };
  104. int main()
  105. {
  106.         MyLinkList *lklist = new MyLinkList();
  107.         (*lklist)->ListCreateTail(lklist, 10);
  108.         (*lklist)->ListShow(lklist);
  109.         cout << "===============================" << endl;
  110.         (*lklist)->MyChangeTest(lklist);//方法1
  111.         (*lklist)->ListShow(lklist);
  112.         (*lklist)->ClearLinkList(lklist);
  113.         delete(lklist);
  114.         lklist = nullptr;
  115.         cout << "=================================================" << endl;
  116.         MyLinkList *lklist2 = new MyLinkList();
  117.         (*lklist2)->ListCreateTail(lklist2, 10);
  118.         (*lklist2)->ListShow(lklist2);
  119.         cout << "===============================" << endl;
  120.         (*lklist2)->MyChangeTest2((*lklist2), (*lklist2)->data);//方法2
  121.         (*lklist2)->ListShow(lklist2);
  122.         (*lklist2)->ClearLinkList(lklist2);
  123.         delete(lklist2);
  124.         lklist2 = nullptr;

  125.         int pause;
  126.         cin >> pause;
  127.         return 0;
  128. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-10-15 04:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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