问题  使用4D链表在Winform上制作全功能记事本

正义的

新成员
已加入
2021年1月3日
留言内容
4
编程经验
Beginner
我正在创建一个福彩12选5走势图结构项目。我的任务是使用4D链表并以Windows形式显示链表。
如何在Winform中显示链接列表福彩12选5走势图以及如何使用剪切副本粘贴功能?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
什么是4D链表?

为什么需要显示它?

这样的福彩12选5走势图结构通常如何可视化?您为什么不能以相同的方式可视化它?

记事本与此有何关系?

剪贴板操作(例如剪切,复制和粘贴)与该福彩12选5走势图结构有什么关系?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
看起来也可以交叉发布在这里:
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
我的天啊!我们的OP有一位糟糕的老师,他给人的任务是这样的 C / C ++分配:
创建一个记事本,允许用户在控制台上编写文本。为此,用户应
能够控制和跟踪光标的移动。用户可以访问,添加和删除
文本。要添加或删除文本,用户可以将光标移至该位置(使用箭头键),然后
执行所需的操作。程序的工作方式(即光标的移动,添加和
删除操作)必须与真实记事本的工作方式保持一致。但是,您没有
处理自动换行。

此外,用户应该能够分别使用S和L将福彩12选5走势图保存并加载到文本文件中。
该程序将自动将福彩12选5走势图保存在文件save.txt中,并从同一文件加载福彩12选5走势图。
无需询问用户文件名。使用Q退出记事本。别忘了
实现析构函数。

在内部,记事本由二维双链表组成。它的实现只是
像带有附加属性的双向链表,它可以在两个维度上增长。由于文字可以
如果多行编写,则2D链表的每一行代表一行。每个节点包含四个
它用来连接到节点之前,之后,下方和上方的链接。此外,每个节点都可以存储
一个角色。

这是进行文本编辑器的糟糕方法。考虑一个基本节点如下所示:
C#:
class Node
{
    public char Char { get; set; }
    public Node Before { get; set; }
    public Node After { get; set; }
    public Node Above { get; set; }
    public Node Below { get; set; }
}

在64位计算机上,对节点的这4个引用中的每一个将占用8个字节。保留在那里的字符将占用2个字节(因为.NET Framework中的字符为16位)。而且我怀疑编译器还会在字符和第一个引用之间添加一些填充以使其达到适当的对齐方式,因此有效地整个节点将用尽2 + 2 + 4 * 8 == 36字节或2 + 6 + 4 * 8 == 40个字节那是每个字符。因此,由1MB ASCII文本组成的文本文件将占用36MB至40MB的RAM。那是一个糟糕的文本编辑器。即使是Visual Studio,它也是内存消耗者,也没有这种内容与内存开销之比。

是的,是的,我知道我上面的链接描述了一个二维双重链接列表,但这 其他链接,细节较少 也具有基本相同的分配,并且该线程上的OP将其福彩12选5走势图结构称为4D链表。
 

正义的

新成员
已加入
2021年1月3日
留言内容
4
编程经验
Beginner
我知道这是创建记事本的糟糕方法。但这就是我要做的项目。我陷入了这种困境。因此,我必须执行此代码。无论如何,我成功地使用Cpp创建了一个4D记事本。如果您想看看附件文件。我在从用户获取福彩12选5走势图时遇到问题原因无法使用console.read(),所以有什么方法可以创建代码
 

附件

  • notepad.txt
    12.3 KB · Views: 10

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
I see in your C++ code that you are using _getch(). The .NET Framework's Console.Read() is pretty much equivalent to _getch().

Also, I see in your C++ code that you are familiar with using the Windows Console APIs. If you are having trouble with Console.Read() you could just use P/Invoke calls to call the Windows Console APIs directly. Basically the Console class is just a nice wrapper around the Console APIs. Nobody says that you have to use that wrapper if you know a better way.
 

正义的

新成员
已加入
2021年1月3日
留言内容
4
编程经验
Beginner
I see in your C++ code that you are using _getch(). The .NET Framework's Console.Read() is pretty much equivalent to _getch().

Also, I see in your C++ code that you are familiar with using the Windows Console APIs. If you are having trouble with Console.Read() you could just use P/Invoke calls to call the Windows Console APIs directly. Basically the Console class is just a nice wrapper around the Console APIs. Nobody says that you have to use that wrapper if you know a better way.
我对C#感到很新鲜,并告知。我有Cpp的经验。您能向我解释一下如何使用P / invoke调用获取用户输入的更多内容。
嗯在c ++中,我现在使用std :: cin从用户那里获取福彩12选5走势图,如何从用户那里获取福彩12选5走势图?非常感谢您的帮助  :)
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
您的意思是告诉我,您不理解您的任何控制台API调用以突出显示,移动光标等?您是否只是在不理解的情况下复制并粘贴了该代码?

Umm. _getch() does not use std::cin.

Anyway, I'm sorry. I misspoke about the equivalence of _getch() and Console.Read(). The equivalent is Console.ReadKey().

要了解有关P / Invoke的更多信息,请参见此处:

控制台API在此处列出:
函数名称很容易解释。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
这是进行文本编辑器的糟糕方法。
当然可以,但这不是重点。这样的分配重点不是要创建有用的应用程序,而是要证明您了解如何使用构件块。这项任务是关于链表的,文本编辑器只是达到目的的一种手段。这样的分配总是人为设计的,因为要找出要测试的特定事物几乎是不可能的。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
但是,这是一种更好的方法,它使用两个效率更高的双链表:
C#:
class Line
{
    public Line Above { get; set; }
    public Line Below { get; set; }
    public TextRun FirstRun { get; set; }
}

class TextRun
{
    public TextRun Next { get; set; }
    public TextRun Previous { get; set; }
    pubic string Text { get; set; }
    public Formatting Formatting { get; set; }
}
 
最佳 底部