我已经在这方面工作了大约一天,并且无法在链表中间放置一系列节点。总而言之,我正在尝试编写的程序接受一个字符串,另一个字符串和一个整数,并将第二个字符串放在由第一个字符串组成的链表中的整数位置。我已经尝试了很多策略,但他们都遇到了无响应的程序和分段错误。我的代码如下:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct node
{
int number;
char j;
struct node* next;
struct node* prev;
}node_t;
void print(node_t *head)
{
node_t *curr = head;
while(curr)
{
printf("\n%d%c\n", curr->number, curr->j);
curr = curr->next;
}
}
void insert(int index, node_t *head, node_t *tail, char* string)
{
node_t *curr = head;
node_t *newNode = (node_t*)malloc(sizeof(node_t));;
node_t *newPrev = (node_t*)malloc(sizeof(node_t));;
node_t *newNext = (node_t*)malloc(sizeof(node_t));;
int i;
while(curr->number!=index)
{
curr = curr->next;
}
//printf("\n%d%c\n", curr->number, curr->j);
newNode->prev = curr;
newNode->next = curr->next;
newNext = curr->next;
curr->next = newNode;
curr = curr->next;
for(i=0; i<strlen(string); i++)
{
curr=(node_t*)malloc(sizeof(node_t));
curr->number = i;
curr->j = string[i];
curr->prev = tail;
tail->next = curr;
tail = curr;
}
newNext->prev = curr;
}
int main()
{
node_t *curr,*head,*tail;
head=NULL;
tail=NULL;
int i;
int index = 0;
char* inputString = (char*)malloc(sizeof(char)+1);
char* inputString2 = (char*)malloc(sizeof(char)+1);
printf("Please input a string: ");
gets(inputString);
printf("%s\n", inputString);
for(i=0; i<strlen(inputString); i++)
{
curr=(node_t*)malloc(sizeof(node_t));
curr->number = i;
curr->j = inputString[i];
curr->next = NULL;
if(tail)
{
curr->prev = tail;
tail->next = curr;
}
tail=curr;
if(!head)
{
head=curr;
}
}
printf("Please input a string: ");
gets(inputString2);
printf("%s\n", inputString2);
printf("Please input a valid index: ");
scanf("%d", &index);
while(index>strlen(inputString)||index<0)
{
printf("A valid index. ");
scanf("%d", &index);
}
printf("%d\n", index);
insert(index, head, tail, inputString2);
print(head);
return 0;
}
如果有人能提供将第二个字符串作为元素插入链接列表的方法,我将永远感激不尽。我已经确定它可以识别整数指定的节点,但除此之外我不确定。提前谢谢。
编辑:现在我的问题是该程序将垃圾节点放在正确的位置,但随后在列表的末尾创建节点。
答案 0 :(得分:0)
您的代码仍有很多问题,如果不给您“答案”,可能无法在此论坛中为您提供帮助。您可以尝试使用其他网站。
一些提示:
由于可以在插入函数中修改头部和/或尾部,因此需要传入它们的地址,而不仅仅是它们的值。即,
void func(node_t **head) {
// dereference head (with *) to use it
*head = malloc(sizeof(node_t));
}
void another_func() {
node_t *head = NULL;
func(&head); // pass the address of head
}
newPrev未使用(您是否使用正确的警告级别编译?使用gcc,添加-Wall标志)。
newNext不需要任何malloced空间,因为它用于指向先前分配的空间。
还有其他错误(逻辑错误)更难以描述。
我的建议是重写它。声明另一个名为list的结构来保存head和tail指针。编写一个名为make_node的函数来创建和初始化给定字符的新节点(如果您认为有必要,则创建一个数字)。编写一个名为make_list的函数,它接受一个字符串并返回其字符列表。在insert函数中,使用make_list从要插入的字符串中创建一个列表,然后修改指针以将其插入到第一个列表中。
在节点中存储索引号是不必要的,并且实际上使事情变得复杂,因为为了保持它们的顺序,您需要在插入后更新原始列表中的索引。您可以简单地计算您已经循环的节点数,以了解节点的索引。
在您的问题中添加C语言标记可能会让其他人帮助您。