Pointers 如何使用链表数组

Pointers 如何使用链表数组,pointers,arraylist,linked-list,char,word,Pointers,Arraylist,Linked List,Char,Word,在这里,我需要使用一组链表来存储从文本中获取的单词。 我完成了整个结构的实现:我定义了数组和列表的节点 为了从文本中提取单词,我使用了strtok函数,这是我的代码 我现在的问题是如何创建列表,根据单词的第一个字母来包含单词。 请注意,每个列表都由T[i]指向,从0到25首先,欢迎来到Yanis社区 其次,请使用StackOverflow的代码段功能提供所有代码,并在文本和标记中指定您使用的编程语言 现在,我从你的问题推断,你需要一个双链表的C(?)实现,它表示字符串中的标记,并将这些列表存储

在这里,我需要使用一组链表来存储从文本中获取的单词。 我完成了整个结构的实现:我定义了数组和列表的节点

为了从文本中提取单词,我使用了strtok函数,这是我的代码

我现在的问题是如何创建列表,根据单词的第一个字母来包含单词。
请注意,每个列表都由T[i]指向,从0到25

首先,欢迎来到Yanis社区

其次,请使用StackOverflow的代码段功能提供所有代码,并在文本和标记中指定您使用的编程语言

现在,我从你的问题推断,你需要一个双链表的C(?)实现,它表示字符串中的标记,并将这些列表存储在一个数组中,这将是标记化字符串

现在,这里是我基于对这个问题的理解而实施的,如果我错了,请澄清

#包括
#包括
#包括
#定义最大令牌数25
//节点指针类型
typedef结构节点*p_节点;
//双链表的节点结构
结构节点
{
char val;//存储在节点中的字符
int line;//字符的第行
int pos;//字符在行中的位置
p_node next;//下一个节点(如果是最后一个节点,则为NULL)
p_node prev;//上一个节点(如果是第一个节点,则为NULL)
};
//将字符串转换为节点的实用函数
p_节点strotnode(char*str,int*pos,int*line)
{
//列表的第一个节点
p_节点fnode=(p_节点)malloc(sizeof(struct节点));
fnode->val=str[0];
fnode->line=*行;
fnode->pos=*pos;
fnode->prev=NULL;
//将上一个节点存储在列表中,以便为下一个节点设置
p_节点pnode=fnode;
++(*pos);
int i;
对于(i=1;ival=str[i];
nnode->line=*行;
nnode->pos=*pos;
nnode->prev=pnode;
nnode->next=NULL;
++(*pos);
//更新上一个节点并向前移动
pnode->next=nnode;
pnode=nnode;
}
}
返回fnode;
}
int main(int argc,字符**argv)
{
p_node nodes[MAX_TOKENS];//指向双链接列表第一个节点的指针数组
字符分隔符[]=“;-”()1234567890:!%?,+-”;
字符*令牌;
char str[]=“你好工作\nld”;
strlwr(str);
内线=0;
int pos=0;
int n_令牌=0;
token=strtok(str,分隔符);
while(令牌!=NULL&&n\u令牌行,节点->pos,节点->val);
节点=节点->下一步;
}
printf(“\n”);
}
返回0;
}
更新#1 自从OP发表评论后,我对代码的要求就更清楚了。数组中包含表示单个单词的列表,而不是我的第一个直觉,该列表表示以相同字母开头的单词

因此,下面是代码的更新版本。OP澄清了他的输入理论上是一个文件。我也调整了代码以反映这一点

我还添加了一些内存管理,但没有检查内存泄漏

对于文件读取,我使用了由实现的
getline
函数,因为POSIX标准版本在Windows系统上不存在

#包括
#包括
#包括
#包括
#包括
//从https://stackoverflow.com/questions/735126/are-there-alternate-implementations-of-gnu-getline-interface/
//如果typedef不存在(msvc,等等)
typedef intptr\u t ssize\t;
ssize\u t getline(字符**lineptr,大小\u t*n,文件*流){
尺寸和位置;
INTC;
if(lineptr==NULL | | stream==NULL | | n==NULL){
errno=EINVAL;
返回-1;
}
c=getc(流);
如果(c==EOF){
返回-1;
}
如果(*lineptr==NULL){
*lineptr=malloc(128);
如果(*lineptr==NULL){
返回-1;
}
*n=128;
}
pos=0;
而(c!=EOF){
如果(位置+1>=*n){
大小新大小=*n+(*n>>2);
如果(新尺寸<128){
新的_大小=128;
}
char*new_ptr=realloc(*lineptr,new_size);
if(new_ptr==NULL){
返回-1;
}
*n=新尺寸;
*lineptr=新的\u ptr;
}
((无符号字符*)(*lineptr))[pos++]=c;
如果(c=='\n'){
打破
}
c=getc(流);
}
(*lineptr)[pos]='\0';
返回pos;
}
#定义MAX_标记26
#定义文件名“test\u FILE.txt”
//节点指针类型
typedef结构节点*p_节点;
//双链表的节点结构
结构节点
{
char*val;//存储在节点中的字符串
int line;//字符的第行
int pos;//字符在行中的位置
p_node next;//下一个节点(如果是最后一个节点,则为NULL)
p_node prev;//上一个节点(如果是第一个节点,则为NULL)
};
p_节点插入(p_节点列表、字符*str、整数*行、整数*pos)
{
//首先,我们需要到达列表的末尾
p_节点lnode=NULL;
如果(列表!=NULL)
{
for(lnode=list;lnode->next!=NULL;lnode=lnode->next);
}
//创建新节点
p_节点nnode
 Hello world

This is A
     test
# Tokens starting with a
        [2:16] a

# Tokens starting with h
        [0:0] hello

# Tokens starting with i
        [2:14] is

# Tokens starting with t
        [2:10] this
        [3:17] test

# Tokens starting with w
        [0:5] world