首页 文章

指针变量与C中堆栈操作中的全局变量

提问于
浏览
0

这是一个通过链表执行堆栈操作的简单程序,这是正式的方法 . 我理解指示堆栈顶部和指向下一个节点的指针所需的指针的概念 . 但是有必要制作指针变量结构变量的结构在这种情况下结构学生变量即typedef到Student . 我声明为Student *(任何名称);然后通过malloc动态分配内存 . 我可以使用全局变量作为Student(anyname);并且使用是填充信息然后推送到堆栈 . 那么使用全局变量或指针有什么区别和优点和缺点 .

关于我自己编写的程序,它工作正常 .

typedef struct student{
    int roll;
    char name[30];
    struct student *next;

}Student;

typedef struct stack{
Student *top;

}Stack;

Student *makestudent(int r,char n[]){
Student *newstudent;
if((newstudent=(Student *)malloc(sizeof(Student)))==NULL){
    printf("Out Of Memory");
 }
 else{
newstudent->roll=r;
strcpy(newstudent->name,n);
newstudent->next=NULL;
}

return newstudent;

 }


void push(int r,char n[],Stack *s){
Student *student=makestudent(r,n);
student->next=s->top;
s->top=student;
}

Student *pop(Stack *s){

Student *st=s->top;
s->top=s->top->next;
return st;

}

1 回答

  • 0

    下面是一些使用静态数组LIFO堆栈的代码,不使用指针 . 主要问题是你必须猜测这个堆栈有多大 . 如果你想在它变得太大时重新分配,你就会回到使用指针 .

    #include <stdio.h>
    #include <string.h>
    #define MAXS    10          // stack size
    
    typedef struct {
        int roll;
        char name[30];
    } student;    
    
    student studs [MAXS];
    int stacktop = 0;
    
    int push(student *s) {
        if (stacktop >= MAXS)
            return 1;           //mega fail
        studs [stacktop++] = *s;
        return 0;
    }
    
    int pop(student *s) {
        if (stacktop <= 0)
            return 1;           //mega fail
        *s = studs [--stacktop];
        return 0;
    }
    
    int main(void) {
        student entryput = {42, "Arthur Dent"};
        student entryget;
        if (push (&entryput))
            return 1;           // need to handle better than this
    
        if (pop (&entryget))
            return 1;           // need to handle better than this
        printf ("Name: %s, Roll: %d\n", entryget.name, entryget.roll);
        return 0;
    }
    

    节目输出:

    Name: Arthur Dent, Roll: 42
    

相关问题