所以这是我的链表计划的代码。我知道它不是那么好,但它有效。我想更改ins()函数,以便按大小将新元素插入到列表中。即,列表中的最后一个节点将包含最大整数,并且第一个节点最小。从文本文件中读取整数,正如您在main()中看到的那样,文本文件中的INSERT和REMOVE命令被解释为在列表中插入(下一行的下一个整数)的命令,或者从列表中删除元素。如何使用现有代码执行此操作?我尝试修改我的ins()函数,但无法正确订购我的列表。
#include <stdio.h>
#include <stdlib.h>
struct node {
int number;
struct node *next;
};
/* prototypes */
void ins(struct node *llist, int number);
void rem(struct node *llist);
void sho(struct node *llist);
int main(void)
{
int number;
char command[6];
struct node *llist;
struct node *root;
llist = (struct node *)malloc(sizeof(struct node));
llist->number = 0;
llist->next = NULL;
root = llist;
printf("addr: \n\n%p,%p\n\n", &llist, &root);
FILE *file;
file = fopen("a3data.txt", "r");
if (file == NULL)
{
printf("\n----------------------------------------\n");
printf("| Error. Did not read file. Exiting. |\n");
printf("----------------------------------------\n\n");
exit(1);
}
else
{
while ((fscanf(file, "%s", command)) != EOF)
{
if((strcmp(command, "INSERT"))==0)
{
fscanf(file, "%d", &number);
printf("\nINSERT ", number);
ins(llist, number);
sho(llist);
}
else if((strcmp(command, "REMOVE"))==0)
{
printf("\n REMOVE ");
rem(llist);
sho(llist);
}
}
}
printf("\n");
free(llist);
return(0);
}
void ins(struct node *llist, int number)
{
while(llist->next != NULL)
{
llist = llist->next;
}
llist->next = (struct node *)malloc(sizeof(struct node));
llist->next->number = number;
llist->next->next = NULL;
}
void rem(struct node *llist)
{
while(llist->next->next != NULL)
{
llist = llist->next;
}
llist->next = NULL;
}
void sho(struct node *llist)
{
while(llist->next != NULL)
{
printf("%d ", llist->number);
llist = llist->next;
}
printf("%d", llist->number);
}
答案 0 :(得分:0)
在ins()
函数中,而不是
while(llist->next != NULL)
使用
while((llist->next != NULL) && (llist->number < number))
这将帮助您在插入时进行排序。
同样在rem()
函数中,您必须释放动态分配的内存。
答案 1 :(得分:0)
您的插入只是在尾部添加元素。您必须编写代码来比较节点(list-&gt; number)的当前值与要插入的数字。如果当前值大于要插入的数字,则必须在当前节点之前插入该数字。为此,您还必须保留前一个指针。我写的代码只是为了理解逻辑,没有检查是否正确。
if(llist->number > innumber) {
node *newNode = (struct node *)malloc(sizeof(struct node);
newNode->number = innumber;
prevPointer->next = newNode;
newNode->next = llist;
}
答案 2 :(得分:0)
您案例中的修改功能
void ins(struct node *llist, int number)
{
struct node *llist1;
while(llist->next != NULL)
{
if (llist->next->number > number)
break;
llist = llist->next;
}
llist1 = (struct node *)malloc(sizeof(struct node));
llist1->number = number;
llist1->next = llist->next;
llist->next = llist1;
}