在C中按顺序插入linkedList
我正在尝试按照字符串的顺序在linkedList中插入一个节点。我相信指针有问题,因为我在运行程序时遇到了分段错误。该节点有两个数据字段:字符串的字符数组和表示数字的整数。列表只需要按名称排序在C中按顺序插入linkedList,c,C,我正在尝试按照字符串的顺序在linkedList中插入一个节点。我相信指针有问题,因为我在运行程序时遇到了分段错误。该节点有两个数据字段:字符串的字符数组和表示数字的整数。列表只需要按名称排序 typedef struct node { char *name; int num; struct node *next; } Node; Node *head = NULL; int insertInOrder(char *newName, int favNum) { Node *
typedef struct node {
char *name;
int num;
struct node *next;
} Node;
Node *head = NULL;
int insertInOrder(char *newName, int favNum) {
Node *current = head;
Node *newNode;
Node *tempNode;
int nodeIn = 0;
if (head == NULL) {
head = malloc(sizeof(Node));
if(head == NULL){
fprintf(stderr, "ERROR: Out of memory\n");
return 1;
}
head->name = newName;
head->num = favNum;
head->next = NULL;
} else {
while (current != NULL) {
if (strcmp(newName, current->name) == 0) {
fprintf(stderr, "ERROR: Name already exists in the list\n");
return 1;
}
if (strcmp(newName, current->name) < 0) {
tempNode = current->next;
newNode = malloc(sizeof(Node));
if(newNode == NULL){
fprintf(stderr, "ERROR: Out of memory\n");
return 1;
}
newNode->name = newName;
newNode->num = favNum;
newNode->next = tempNode;
current->next = newNode;
nodeIn = 1;
}
current = current->next;
}
if(nodeIn == 0){
newNode = malloc(sizeof(Node));
if(newNode == NULL){
fprintf(stderr, "ERROR: Out of memory\n");
return 1;
}
newNode->name = newName;
newNode->num = favNum;
current->next = newNode;
newNode->next = NULL;
}
}
return 0;
}
typedef结构节点{
字符*名称;
int-num;
结构节点*下一步;
}节点;
Node*head=NULL;
int insertinoder(char*newName,int favNum){
节点*电流=头部;
节点*新节点;
节点*临时节点;
int nodeIn=0;
if(head==NULL){
head=malloc(sizeof(Node));
if(head==NULL){
fprintf(stderr,“错误:内存不足\n”);
返回1;
}
head->name=newName;
head->num=favNum;
head->next=NULL;
}否则{
while(当前!=NULL){
if(strcmp(newName,current->name)==0){
fprintf(stderr,“错误:列表中已存在名称\n”);
返回1;
}
if(strcmp(newName,current->name)<0){
tempNode=当前->下一步;
newNode=malloc(sizeof(Node));
if(newNode==NULL){
fprintf(stderr,“错误:内存不足\n”);
返回1;
}
newNode->name=newName;
newNode->num=favNum;
newNode->next=tempNode;
当前->下一步=新节点;
nodeIn=1;
}
当前=当前->下一步;
}
if(nodeIn==0){
newNode=malloc(sizeof(Node));
if(newNode==NULL){
fprintf(stderr,“错误:内存不足\n”);
返回1;
}
newNode->name=newName;
newNode->num=favNum;
当前->下一步=新节点;
newNode->next=NULL;
}
}
返回0;
}
以下是您需要注意的代码缺陷--
1if(head!=NULL)
{
如果(strcmp(newName,current->name)>0)也需要编写代码。
}
2.
如果第一个节点的strcmp(newName,current->name)<0,则需要在第一个节点之前插入节点,而不是在第一个节点之后插入节点
3.
在while循环的任何迭代中插入新节点后,需要将从while
循环中断开
我希望您会发现这些更正很有用。以下是您的代码中需要注意的缺陷--
1
if(head!=NULL)
{
如果(strcmp(newName,current->name)>0)也需要编写代码。
}
2.
如果第一个节点的strcmp(newName,current->name)<0
,则需要在第一个节点之前插入节点,而不是在第一个节点之后插入节点
3.
在while循环的任何迭代中插入新节点后,需要将从while
循环中断开
我希望您会发现这些更正很有用。确保您测试了所有这些案例--
- 空列表
- 列表中的第一个节点
- 列表中列表数超过2的最后一个节点
- 列表中两个项目之间的节点
- 列表中的第二个节点
- 列表中倒数第二个节点
通过“测试”所有这些情况,我不是指运行程序并看到它崩溃,我是指查看代码并理解代码在每种情况下的执行方式
我喜欢画一些盒子和箭头,当我看到它会做什么的时候。不要害怕一步一步地去做
查看上面的代码,我可以看到上面的许多情况您没有正确处理,因此我并不奇怪您会出现seg故障。确保您测试了所有这些情况--
- 空列表
- 列表中的第一个节点
- 列表中列表数超过2的最后一个节点
- 列表中两个项目之间的节点
- 列表中的第二个节点
- 列表中倒数第二个节点
通过“测试”所有这些情况,我不是指运行程序并看到它崩溃,我是指查看代码并理解代码在每种情况下的执行方式
我喜欢画一些盒子和箭头,当我看到它会做什么的时候。不要害怕一步一步地去做
查看上面的代码,我可以看到上面的许多情况您没有正确处理,因此我对您出现seg故障并不感到惊讶。您是否尝试运行valgrind
并查看在哪一行出现分段故障?您是否可以显示对insertinoder
的调用?我认为问题是存在的。如果数据字符串小于当前节点的数据字符串,则必须在currentnode之前插入,而不是在nextnode之前,并且新节点必须与前一个节点链接……而且逻辑也有缺陷,因为在插入节点后,您继续解析列表,而不是退出。因此,从这一点开始,新的数据节点将在每个节点上插入。您是否尝试运行valgrind
并查看在哪一行出现分段错误?能否显示对insertinoder
的调用?我认为问题是存在的。如果数据字符串小于当前节点的数据字符串,则必须在currentnode之前插入,而不是在nextnode之前,并且新节点必须与前一个节点链接……而且逻辑也有缺陷,因为在插入节点后,您继续解析列表,而不是退出。因此,从该点开始,将在每个节点上插入一个新的数据节点。