C语言中带字符串的链表排序

C语言中带字符串的链表排序,c,string,linked-list,C,String,Linked List,我有一个结构,有一个名称和一个名为nextName的节点 这是一个单链接列表,我的任务是根据字符串的字母顺序创建列表 所以,如果我输入Joe Zolt和Arthur,我应该将我的列表结构化为 乔 乔·佐尔特 阿瑟·乔·佐尔特 我在实现正确的算法时遇到了问题,这将使指针按正确的顺序排列 这就是我现在拥有的。 Temp将是用户刚刚输入并试图放入列表的名称, namebox只是我的根目录的一个副本,是整个列表 if(temp != NULL) { stru

我有一个结构,有一个名称和一个名为nextName的节点

这是一个单链接列表,我的任务是根据字符串的字母顺序创建列表

所以,如果我输入Joe Zolt和Arthur,我应该将我的列表结构化为

乔·佐尔特

阿瑟·乔·佐尔特

我在实现正确的算法时遇到了问题,这将使指针按正确的顺序排列

这就是我现在拥有的。 Temp将是用户刚刚输入并试图放入列表的名称, namebox只是我的根目录的一个副本,是整个列表

 if(temp != NULL)
      {
              struct node* namebox = root;
              while (namebox!=NULL && (strcmp((namebox)->name,temp->name) <= 0))
              {
                      namebox = namebox->nextName;
                      printf("here");
                 }
                temp->nextName = namebox;
    namebox = temp;
    root = namebox;
if(温度!=NULL)
{
结构节点*namebox=root;
while(namebox!=NULL&(strcmp((namebox)->name,temp->name)nextName;
printf(“此处”);
}
temp->nextName=namebox;
名称框=温度;
根=名称框;
如果我输入像CCC BBB而不是AAA这样的名称,现在就可以了

我打印时会收到AAA BBB CCC

但如果我把AAA BBB CCC,当我打印时,我只得到CCC,它切断了以前的

编辑:


有人能告诉我代码是什么样子的吗,我记不下来。

当你输入AAA、BBB,然后输入CCC
namebox
时,while循环结束时,它总是
NULL

然后你在做:

// namebox is null
temp->nextName = namebox;
// namebox = CCC
namebox = temp;
// root = CCC
root = namebox;
因此,这就是为什么您只能获得
CCC

现在,在这些情况下,您需要做的是确保在列表末尾添加了
CCC
,并且不更改根目录。

您所描述的是

当您输入AAA、BBB和CCC时,while循环完成时,
namebox
NULL

然后当您执行
temp->nextName=namebox
时,
namebox
NULL
。然后将
namebox
设置为
temp
(保存
CCC
)。最后将
root
设置为
namebox
,并将其设置为
CCC
。这就是您获得
CCC
的原因

在您的算法中,您需要处理在列表末尾或中间添加内容的情况,并且在这些情况下不更改根。事实上,这应该是一般情况。在前端和末尾添加内容应该是您的特殊情况

if(temp != NULL)
{
    struct node* namebox = root;
    while (namebox!=NULL)
    {
        if(strcmp(namebox->Name,temp->Name) > 0) // if temp comes before this
        {
            temp->nextName = namebox->nextName;
            namebox->nextName = temp;
            //printf("here"); I'm guessing this is debugging stuff?
        }
        namebox = namebox->nextName;
    }
}
这是用于一般插入,但在添加名字并添加到列表开头时,必须执行特殊情况

\include
   #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct node
    {
        char data[100];
        struct node* next;
    };
    
    struct node* head = NULL;
    
    struct node* getnode(char *v)
    {
        struct node* newnode = (struct node*)malloc(sizeof(struct node));
        strcpy(newnode->data,v);
        newnode->next = NULL;
        return newnode;
    };
    
    void insert(char *v)
    {
        struct node* newnode = getnode(v);
        newnode->next = head;
        head = newnode;
    }
    
    void print()
    {
        struct node* temp = head;
        //struct node* end = NULL;
        int c = 1;
        while(temp->next != NULL)
        {
            temp = temp->next;
            c++;
        }
        temp = head;
        char x[100];
        for(int i=0;i<c;i++)
        {
            temp = head;
            while(temp->next != NULL)
            {
                if(strcmp(temp->data,temp->next->data) > 0)
                {
                    strcpy(x,temp->data);
                    strcpy(temp->data,temp->next->data);
                    strcpy(temp->next->data,x);
                }
                temp = temp->next;
            }
            //end = temp;
        }
        temp = head;
        while(temp != NULL)
        {
            printf("%s\t",temp->data);
            temp = temp->next;
        }
        printf("\n\n The Length of the list : %d",c);
    }
    
    int main()
    {
        printf("Hello world!\n");
        char v[100];
        while(1)
        {
            printf("enter a string : ");scanf("%s",v);
            if(v[0] == 'Q' || v[0] == 'q')
            {
                break;
            }
            else
            {
                insert(v);
            }
        }
        print();
        return 0;
    }
    
#包括 #包括 结构节点 { 字符数据[100]; 结构节点*下一步; }; 结构节点*head=NULL; 结构节点*getnode(char*v) { 结构节点*新节点=(结构节点*)malloc(sizeof(结构节点)); strcpy(newnode->data,v); newnode->next=NULL; 返回newnode; }; 无效插入(字符*v) { 结构节点*newnode=getnode(v); 新建节点->下一步=头部; 头=新节点; } 作废打印() { 结构节点*温度=头部; //结构节点*end=NULL; int c=1; while(临时->下一步!=NULL) { 温度=温度->下一步; C++; } 温度=水头; charx[100]; for(int i=0;不精确!=NULL) { 如果(strcmp(临时->数据,临时->下一步->数据)>0) { strcpy(x,temp->data); strcpy(临时->数据,临时->下一步->数据); strcpy(临时->下一步->数据,x); } 温度=温度->下一步; } //结束=温度; } 温度=水头; while(temp!=NULL) { printf(“%s\t”,临时->数据); 温度=温度->下一步; } printf(“\n\n列表的长度:%d”,c); } int main() { printf(“你好,世界!\n”); charv[100]; 而(1) { printf(“输入字符串:”;scanf(“%s”,v”); 如果(v[0]=“Q”| v[0]=“Q”) { 打破 } 其他的 { 插入(v); } } 打印(); 返回0; }
啊,好吧,我明白了,现在它只是在实现它。那么这是否意味着我应该为strcmp((namebox)->name,temp->name)>=0(这里的键是>=)创建一个场景?所以我需要一个strcmp((namebox)->name,temp->name)=0个strcmp((namebox)->name,temp->name)name,temp->name)>=0??或多或少。应该有一种方法来构造您的算法,以便您能够优雅地处理此问题。插入排序与插入链接节点没有什么区别,实际上是一种更简单的插入排序算法。呃……我指的是“链接列表”而不是“链接节点”。请用您的答案解释您的代码如何回答问题。