поп средний элемент в C - PullRequest
0 голосов
/ 18 ноября 2018
  1. Итак, я выполнял свое задание, когда застрял в этом вопросе.Мы используем stack [struct] в C и хотим получить средний элемент стека, я написал общую функцию push и pop с функциями print и isEmpty.Мне просто нужна помощь с вопросом.
  2. Нам нужно вытолкнуть средний элемент из списка.
  3. Пример желаемого входа и выхода приведен ниже

    Input:  Stack[] = [1, 2, 3, 4, 5]
    Output: Stack[] = [1, 2, 4, 5]
    
    Input: Stack[] = [[1, 2, 3, 4, 5, 6]
    Output: Stack[] = [1, 2, 4, 5, 6]
    
  4. и мой код здесь

    #include <stdio.h>
    #include <stdlib.h>
    //self-referenced structure
    struct stackNode {
        int data;
        struct startNode *nextPtr;
    };
    typedef struct stackNode StackNode;
    typedef StackNode StackNodePtr;
    
    //prototypes
    void push(StackNodePtr *topPtr, int info);
    int pop(StackNodePtr *topPtr);
    void printStack(StackNodePtr currentPtr);
    void isEmpty(StackNodePtr *topPtr);
    int main(void){
        StackNodePtr stackPtr = NULL;
        int count= 0;
        char value;
        char input;
        printf("%s","Stack[] = [");
        scanf("%s\n", input );
    
        while(input != "]"){
            scanf("%c, ",&value);
            count++;
            push(&stackPtr, value);
        }
        if(count%2==0){
            count = count / 2;
        }
        else {
            ++count;
            count = count / 2;
        }
        puts("\n");
        printf("Stack[] = ");
        printStack()
    }
    
    void push(StackNodePtr *topPtr,int info){
        StackNodePtr newPtr = malloc(sizeof(StackNode));
    
        if (newPtr != NULL){
            newPtr->data = info;
            newPtr->nextPtr = *topPtr;
            *topPtr = newPtr;
        }
        else {
            printf("%d not inserted, no memory\n", info);
        }
    }
    int pop(StackNodePtr *topPtr){
        StackNodePtr tempPtr = *topPtr;
        int popValue = (*topPtr)->data;
        *topPtr =(*topPtr)->nextPtr;
        return popValue;
    }
    void printStack(StackNodePtr currentPtr){
        if(currentPtr == NULL) {
            puts("The stack is empty\n");
        } else {
            printf("%s","[");
            while(currentPtr != NULL) {
                printf("%d, ",currentPtr->data );
                currentPtr = currentPtr->nextPtr;
            }
            printf("%s","]");
        }
    }
    
    void isEmpty(StackNodePtr topPtr){
        return topPtr == NULL;
    }
    
  5. РЕДАКТИРОВАТЬ:

    //Author: Shivam taneja
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //self-referenced structure
    struct stackNode {
        int data;
        struct stackNode *nextPtr;
    };
    typedef struct stackNode StackNode;
    typedef StackNode *StackNodePtr;
    
    //prototypes
    void push(StackNodePtr *topPtr, int info);
    int pop(StackNodePtr *topPtr, int iter);
    void printStack(StackNodePtr currentPtr);
    int main(void){
        StackNodePtr stackPtr = NULL;
        int count = 0;
        char value;
        printf("%s","Stack[] = [");
        scanf("%c, ", &value);
        while(!(value == ']')) {
            printf()
            scanf("%c",&value);
            count++;
            push(&stackPtr, value);
        }
        if(count%2==0){
            count = count / 2;
        }
        else {
            ++count;
            count = count / 2;
        }
        puts("\n");
        pop(&stackPtr, count);
        printf("Stack[] = ");
        printStack(stackPtr);
    }
    
    void push(StackNodePtr *topPtr,int info){
        StackNodePtr newPtr = malloc(sizeof(StackNode));
    
        if (newPtr != NULL){
            newPtr->data = info;
            newPtr->nextPtr = *topPtr;
            *topPtr = newPtr;
        }
        else {
            printf("%d not inserted, no memory\n", info);
        }
    }
    int pop(StackNodePtr *topPtr, int iter){
        StackNodePtr tempPtr = *topPtr;
        while(iter != 0){
            iter--;
            *topPtr =(*topPtr)->nextPtr;
        }
        int popValue = (*topPtr)->data;
        return popValue;
    }
    void printStack(StackNodePtr currentPtr){
        if(currentPtr == NULL) {
            puts("The stack is empty\n");
        } else {
            printf("%s","[");
            while(currentPtr != NULL) {
                printf("%d, ",currentPtr->data );
                currentPtr = currentPtr->nextPtr;
            }
            printf("%s","]");
        }
    }
    

1 Ответ

0 голосов
/ 18 ноября 2018

Поскольку вы используете список, вам придется делать это иначе, чем с массивом, но вот как вы делаете это с массивом:

[0 | 1 | 2 | 3 | ? | ...]

Допустим, вы хотите добавить элемент 1.

Затем вы сохраняете адрес текущего указателя стека, переходите к тому, который хотите вставить, вставляете его, затем сдвигаете все элементы вперед и перемещаете указатель к предыдущему указателю - 1.

Результат:

[0 | 2 | 3 | ? | ...]

Вы должны сделать то же самое, но со своим списком.

Ваш стек выглядит так:

0->1->2->3->?

Вы хотите открыть 1, перейдите на узел 1, вставьте его, затем переместите все элементы вперед:

0->2->3->?.

Посмотрим, что произойдет, если вы просто удалите 1: 0->? 2->3->?

Список обрезается, вам нужно присоединиться к нему.

Чтобы присоединиться к нему, вам нужно знать previous узел и next узел, тогда это так же просто, как previous.next = next.

Поскольку мы не можем просто заглянуть назад, вам нужно отслеживать предыдущий узел при переборе списка, поэтому найдите нужный элемент, отслеживая предыдущий узел, а затем просто перепишите соединение с previous.next = current, чтобы previous.next = current.next, затем вы можете вернуть значение тока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...