字符串数据结构实现(链表方式)

相较于数组方式的实现,C语言我采用了单链表的方式实现,C++采用了双链表的方式。毫无疑问,双链表的效率肯定是要远高于单链表的。这次支持中文字符的操作,这个实现的思路是,在节点类中添加两个成员变量,一个用来存放char字符,一个用来存放wchar_t字符。关于两者的相互转换及输出请参考 C语言宽字符输出和转换

C代码实现下载
C++代码实现下载
(备用下载地址 )

这里讲一下字符串单链表实现的思路和双链表实现的思路(如果不太懂单链表的实现和双链表的实现请参考线性表之单链表线性表之双向链表

毫无疑问,用链表的方式来存储的时候,是一个个节点进行存储的,所以一个节点内你可以存放char字符或者wchar_t字符,不想数组那样,存放以及取出wchar_t字符是如此的困难。

单链表方式:
1.创建一个节点结构体,里面包含三个字段,分别是char、wchar_t、和Node*。

typedef struct _node
{
    char c;         //窄字节
    wchar_t w;      //宽字节
    _node* next;
}Node,*PNode;

2.创建一个字符串结构体,用来管理字符节点,里面包含三个字段,分别是count(字符串长度)、headNode(头节点)、endNode(尾节点)。

typedef struct _string
{
    int count;        //字符个数
    PNode headNode;   //存放数据的节点(可以理解为一个String有一个头节点,然后访问数组的时候通过这个头节点访问)
    PNode endNode;    //方便访问最后一个节点
}String,*PString;

3.第三步就是实现字符的增、删、改、查操作,这个和单链表的实现基本相同,就是data域换成了char和wchar_t。

4.第四部就是添加进去后的字符,如何取出作为字符串输出,那就是将所有节点的值串起来即可,保存到char*缓冲区中。

双链表方式:
1.创建一个节点类,用来存放字符的值,里面包含四个成员变量,分别是c(char字符)、w(wchar_t字符)、next(后继节点)、pre(前驱节点)。

2.实现字符的增、删、改、查,可以参考双链表的实现代码。

3.取出字符串也是将节点串起来。所以这一步的操作会比数组方式慢很多。

总结一下难点:
第一,如何存储中文字符,一般判断该字符的int值是否大于255即可判断是否是中文字符,大于255就是中文字符,否则是英文字符。之后如果是wchar_t字符就存放在w域中,否则存放在c域中。记住,一个节点中,c和w一定要有一个为0,否则取出的时候不好判断。

第二,如何取出中文字符,如果w值不为0,则可以取出,这个步骤还要细分,首先,先把wchar_t字符转换为char[3]数组,为什么呢?因为一个wchar_t 占2个字符,所以转换后,一个中文字符需要char[0],char[1]两个字节来表示。

第三,如何将一个个节点内的字符串成串,创建一个char* buf的缓冲区,然后从头节点开始遍历,如果c不为0,则是英文字符,此时可以取出直接放进buf中,若w不为0,则是中文字符,此时可以取出进行窄字节的转换后,再放进buf中,此时放进去的是两个字节。以此类推,直到最后一个节点。

第四,这也是最重要的,如果没有这一步,那么wchar_t的转换以及输出都会乱码。那就是用setlocale函数设置字符集环境为中文。具体请参考 C语言宽字符输出和转换

猜你喜欢

转载自blog.csdn.net/qq_18297675/article/details/60574564