在列表中最大元素之后的链表中插入元素

时间:2014-01-28 00:52:29

标签: c pointers linked-list

我一直在这里砸我的头,看看我是否能找到一个解决方案但是在几个无限循环之后,这里是我想要审查的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_TREE_STRING 100

typedef struct Node {
    char val;
    struct Node *next;
} node;

node *create_list(char *list_string) {
    node *momentary=NULL, *new=NULL, *head;
    int i;

    for(i=0; i<strlen(list_string); i++) {
        new = (node *)malloc(sizeof(node));
        new->val = list_string[i];
        new->next = NULL;
        if (!momentary) head = new;
        else momentary->next = new;
        momentary = new;
    }
    return head;
}

int print_list(node *head) {
    node *momentary;

    if(!head) return -1;
    for(momentary=head; momentary!=NULL; momentary=momentary->next)
        printf("%c ", momentary->val);
    printf("\n");
    return 0;
}

node *find_biggest(node *head) {
    node *momentary=NULL, *biggest=head;

    if (head==NULL) return NULL;
    for (momentary=head; momentary!=NULL; momentary=momentary->next) {
        if (momentary->val > biggest->val) biggest = momentary;

    }

    return biggest;
}

void insert_after_biggest(node **head, node **biggest, char val) {

    node *p = *head, *temp=NULL;

    *head = p->next;


    if(*head!=NULL){

        if(p->val==(*biggest)->val){

            temp=p;
            p->next=temp;
            p->val=temp->val;

            p->next=NULL;

            *biggest=p;
            p->next=(*biggest);
            p->val=(*biggest)->val;
            //*biggest=p;

            p->next=NULL;

            //temp=p;
            p->next=temp;
            p->val=temp->val;

        }

        else if(p->val<(*biggest)->val){

            *head = p->next;

            }
    }

}

int main () {
    node *head=NULL, *biggest=NULL;
    int menu_choice;
    char c, val, list_string[MAX_TREE_STRING];

    setbuf(stdout, NULL);
    do {
        menu_choice = 0;
        printf("\n1 Create list \n2 Print");
        printf("\n3 Insert after biggest");
        printf("\n4 exit\n");
        scanf("%d", &menu_choice);
        switch (menu_choice) {
            case 1:
                if (head) {
                    printf("List exist.\n");
                    break;
                }
                printf("Enter list as digits without spaces: ");
                scanf(" %s", list_string);
                head = create_list(list_string);
                break;
            case 2:
                print_list(head);
                break;
            case 3:
                scanf(" %c", &val);
                insert_after_biggest(&head, &biggest, val);
                break;
            case 4:
                break;
            default:
                while((c=getchar())!='\n' && c!=EOF);
        }
    } while(menu_choice!=4);
    return 0;
}
  

现在这里的任务是:

     

写一个函数&#34; insert_after_biggest&#34;所以新元素是   把最高价值和复杂性的元素放在后面   功能必须是O(1)。换句话说,函数&#34; find_biggest&#34;   具有O(n)复杂度的只有在&#34;最大&#34;具有   尚未定义。如果列表没有元素,它仍然需要   先行。

     

这是一个更清晰画面的控制台示例:

     

1 |&lt; -Insert into linked list option |   将列表输入为不带空格的数字:683 |&lt; -Prompt并输入值|   3 |&lt; -Option(函数)|   2 |&lt; -Number to inserted |   2 |&lt; -Print选项|   6 8 2 3 |&lt; -Output |   3 |&lt; -Option |   8 |&lt; -Number to inserted |   2 |&lt; -Print选项|   8 |&lt; -Output |

我自己一直在输入此代码,我不知道如何看待这个。 我会谦虚地问,是否有人可以帮助我解决这个问题,代码编译但是在控制台中执行选项3只会让它在无限循环中运行,导致控制台崩溃。

具体:如何解决(一步一步)以及它应该如何(完成的代码,可能包含在这里?)。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果你可以认为

1)您不需要删除元素

您只需要保留一个额外的指针,该指针始终指向具有最大值的节点。如果您从未打过电话,那么您可以扫描列表中的最大值 insert_after_biggest,但这甚至不是必需的。将该节点称为max,将指针调用max p_max。

每次插入

a)您要插入的值大于max所持有的值,在这种情况下,您插入新值,并更改p_max = p_new。

n_new->next = p_max;
p_max = p_new;

b)您要插入的值大于持有买入最大值,在这种情况下只需插入并保持p_max不变。

对于insert_after_max 你明确地做了

p_new->next = p_max->next;
p_max->next = p_new;

或者,如果新值较大,则按上述步骤操作。

由于您不必扫描要插入的列表,因此插入的复杂性为O(1)