C语言中带字符串的链表排序
我有一个结构,有一个名称和一个名为nextName的节点 这是一个单链接列表,我的任务是根据字符串的字母顺序创建列表 所以,如果我输入Joe Zolt和Arthur,我应该将我的列表结构化为 乔 乔·佐尔特 阿瑟·乔·佐尔特 我在实现正确的算法时遇到了问题,这将使指针按正确的顺序排列 这就是我现在拥有的。 Temp将是用户刚刚输入并试图放入列表的名称, namebox只是我的根目录的一个副本,是整个列表C语言中带字符串的链表排序,c,string,linked-list,C,String,Linked List,我有一个结构,有一个名称和一个名为nextName的节点 这是一个单链接列表,我的任务是根据字符串的字母顺序创建列表 所以,如果我输入Joe Zolt和Arthur,我应该将我的列表结构化为 乔 乔·佐尔特 阿瑟·乔·佐尔特 我在实现正确的算法时遇到了问题,这将使指针按正确的顺序排列 这就是我现在拥有的。 Temp将是用户刚刚输入并试图放入列表的名称, namebox只是我的根目录的一个副本,是整个列表 if(temp != NULL) { stru
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??或多或少。应该有一种方法来构造您的算法,以便您能够优雅地处理此问题。插入排序与插入链接节点没有什么区别,实际上是一种更简单的插入排序算法。呃……我指的是“链接列表”而不是“链接节点”。请用您的答案解释您的代码如何回答问题。