所以这是我的链表程序代码。我知道它没有那么好,但它有效。我想更改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: nn%p,%pnn", &llist, &root);
FILE *file;
file = fopen("a3data.txt", "r");
if (file == NULL)
{
printf("n----------------------------------------n");
printf("| Error. Did not read file. Exiting. |n");
printf("----------------------------------------nn");
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);
}
在中修改的函数
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;
}
您的插入只是在尾部添加元素。您必须编写代码来将节点(列表->编号)的当前值与要插入的编号进行比较。如果当前值大于要插入的数字,则必须在当前节点之前插入该数字。为此,您还必须保留以前的指针。我写的代码只是为了理解逻辑,没有检查正确性。
if(llist->number > innumber) {
node *newNode = (struct node *)malloc(sizeof(struct node);
newNode->number = innumber;
prevPointer->next = newNode;
newNode->next = llist;
}
在ins()
函数中,而不是
while(llist->next != NULL)
使用
while((llist->next != NULL) && (llist->number < number))
这将帮助您在插入自身时进行排序。
同样在rem()
函数中,您必须释放动态分配的内存。