zoukankan      html  css  js  c++  java
  • 二重指针

    • 因为在复习数据结构和C语言,试卷上的算法题只可以使用纯C去完成, 所以这里为了以防万一,复习一下二重指针。

    需求: 将某个变量传参之后, 需要改变这个变量的地址, 将本变量指向一个新的地址。

    typedef struct SqStack
    {
        int data[maxSize];
        int top;
    }SqStack;
    
    void changePoint(SqStack **fir) // 因为传入的是  地址的地址, 所以可以改变fir的地址。
    {
        SqStack sec;
        sec.top = 999;
        *fir = &sec;// 将sec的地址 传给fir。实现地址改变。
    }
    
    int main()
    {
    
        SqStack *fir;
        fir = (SqStack *)malloc(sizeof(SqStack));
        fir->top=-1;
        printf("fir的地址为:%d	 fir的top值为%d
    ",fir,fir->top);
        changePoint(&fir); // 取出fir地址的地址,作为参数传入。
        printf("fir的地址为:%d	 fir的top值为%d
    ",fir,fir->top);
        return 0;
    }
    
    
    • 运行结果如下:
    fir的地址为:10490928    fir的top值为-1
    fir的地址为:6421568     fir的top值为999
    
    Process returned 0 (0x0)   execution time : 0.016 s
    Press any key to continue.
    
    

    额外再加一个代码补充一下吧。

    /* 单链表/链栈 节点的定义 */
    typedef struct LNode
    {
        int data;
        struct LNode *next;
    }LNode;
    
    void initStact(LNode **L)
    {
        *L = (LNode *)malloc(sizeof(LNode));
        (*L)->data=443; //考虑到运算符优先级的问题,这里需要加括号。
    }
    
    int main()
    {
        LNode *lnode;
        printf("变量地址:%d
    ",lnode);
        initStact(&lnode);
        printf("变量地址 %d	 data值:%d
    ",lnode,lnode->data);
        return 0;
    }
    
    
    • 运行结果
    变量地址:16
    变量地址 7279664         data值:443
    
    Process returned 0 (0x0)   execution time : 0.000 s
    Press any key to continue.
    
    • 补充
    /* 二重指针的补充 
    
    Q: 一个栈, 当其栈满时,将其maxSize扩充至二倍。
    
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct SqStack
    {
        int *data;
        int top;
        int maxSize;
    }SqStack;
    
    void initSqStact(SqStack **sq,int maxSize)
    {
        *sq = (SqStack *)malloc(sizeof(SqStack));
        (*sq)->data = (int *)malloc(maxSize*sizeof(int));
        (*sq)->maxSize=maxSize;
        (*sq)->top=-1;
    }
    
    int push(SqStack *sq,int x)
    {
        if(sq->top==sq->maxSize-1){
            if(!stackFull(sq)){
                return 0;       //因为栈满 所以去申请新的空间,如果申请失败则将失败抛出。
            }// 如果申请成功则继续执行。
        }
        sq->data[++sq->top]=x;
        return 1; // 添加成功。
    }
    
    int stackFull(SqStack *sq)
    {
        int *temp = (int *)malloc(2*sq->maxSize*sizeof(int));
        if(temp==NULL)
            return 0; //空间申请失败。
        int i;
        for(i=0;i<sq->maxSize;i++)
            temp[i] = sq->data[i]; // 将原来的元素赋予现在开辟的空间。
        free(sq->data);
        sq->data = temp;
        return 1;
    }
    
    int main()
    {
        SqStack *sq;
        initSqStact(&sq,4);
    
        push(sq,2);
        push(sq,3);
        push(sq,4);
        push(sq,5);
        push(sq,6);
    
        for(int i=0;i<=sq->top;i++){
            printf("%d
    ",sq->data[i]);
        }
    
    }
    
    

    二叉排序树(用到了一点二重指针 略微有点麻烦, 然后记录一下。)

    typedef struct BTNode
    {
        int key;
        struct BTNode *lchild;
        struct BTNode *rchild;
    }BTNode;
    BTNode* BSTSearch(BTNode *bt,int key)
    {
        if(bt==NULL)
            return NULL;
        else
        {
            if(bt->key==key)
                return bt;
            else if(bt->key<key)
                return BSTSearch(bt->lchild,key);
            else
                return BSTSearch(bt->rchild,key);
        }
    }
    int BSTInsert(BTNode **bt,int key)
    {
        if((*bt)==NULL)
        {
            (*bt)=(BTNode *)malloc(sizeof(BTNode));
            (*bt)->lchild=(*bt)->rchild=NULL;
            (*bt)->key=key;
            return 1;
        }
        else
        {
            if((*bt)->key==key)
                return 0;
            else if((*bt)->key<key)
                return BSTInsert(&((*bt)->lchild),key);
            else
                return BSTInsert(&((*bt)->rchild),key);
        }
    }
    void CreateBST(BTNode **bt,int *key,int n)
    {
        int i;
        (*bt)=NULL;
        for(int i=0;i<n;i++)
        {
            BSTInsert(bt,key[i]);
        }
    }
    
    int main()
    {
        BTNode *bt;
        int key[]={1,2,3,4,5,6,7,8,9,0};
        CreateBST(&bt,key,10);
        printf("%d",bt->lchild->lchild->lchild->key);
    }
    
    
  • 相关阅读:
    hadoop的文件系统FileSystem
    关于hadoop的日志
    top命令的使用
    对于多个集合求两两交集(共同关注的用户、共同转载的微薄等)
    hadoop配置含义(继续更新中)
    thrift
    【VS2015】Win7 X64上面安装VS2015
    【经验记录】开发中的实际问题记录
    【VS2012】F5不能自动编译新修改
    斯巴达三百程序员
  • 原文地址:https://www.cnblogs.com/A-FM/p/13618236.html
Copyright © 2011-2022 走看看