我已经做了大约一天了,还没能把一系列节点放在链表的中间。总而言之,我要编写的程序接受一个字符串,另一个字符串和一个整数,并将第二个字符串放在由第一个字符串组成的链表中的整数位置。我尝试过很多策略,但它们都遇到了响应迟钝的程序和分割错误。我的代码如下:
#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%cn", 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%cn", 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("%sn", 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("%sn", inputString2);
printf("Please input a valid index: ");
scanf("%d", &index);
while(index>strlen(inputString)||index<0)
{
printf("A valid index. ");
scanf("%d", &index);
}
printf("%dn", index);
insert(index, head, tail, inputString2);
print(head);
return 0;
}
如果有人能提供一种方法将第二个字符串作为元素插入到链表中,我将不胜感激。我已经确定它可以识别由整数指定的节点,但除此之外我不确定。提前谢谢。
编辑:现在我的问题是程序将垃圾节点放在正确的位置,但随后在列表末尾创建节点。
你的代码仍然有很多问题,如果不简单地给你"答案",在这个论坛上可能是不可能帮助你的。你可以试试别的网站。
一些提示:由于可以在插入函数中修改head和/或tail,因此需要传入它们的地址,而不仅仅是它们的值。例如,
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不需要任何错位的空间,因为它被用来指向以前分配的空间。
还有一些错误(逻辑错误)更难以描述。
我的建议是重写。声明另一个名为list的结构体来保存头指针和尾指针。编写一个名为make_node的函数来创建和初始化一个给定字符的新节点(如果您认为有必要,还可以输入一个数字)。编写一个名为make_list的函数,接受一个字符串并返回字符串的字符列表。在insert函数中,使用make_list从要插入的字符串创建一个列表,然后修改指针将其插入到第一个列表中。
在节点中存储索引号是不必要的,并且实际上使事情变得复杂,因为为了保持它们的顺序,您需要在插入后更新原始列表中的索引。您可以简单地记录您已经循环了多少个节点,以了解节点的索引。
在你的问题中添加C语言标签可能会让其他人来帮助你。