鱼C论坛

 找回密码
 立即注册
查看: 2359|回复: 3

关于C语言指针的写法 :x-y->z范式的

[复制链接]
发表于 2014-11-5 15:07:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 text6789 于 2014-11-5 15:40 编辑
#include   <stdio.h> 
#include   <string.h> 
#include   <stdlib.h> 
#include   <conio.h> 

/*定义全局变量*/ 
#define   TRUE   1 
#define   FALSE   0 
#define   OK   1 
#define   ERROR   0 
#define   NULL   0 
#define   OVERFLOW   -2 
#define   MAXSIZE   100 
#define   stack_init_size   100 
#define   stackincrement   10 
typedef   char   selemType; 
typedef   char   qelemType; 
typedef   char   elemType; 
typedef   int   status; 
char   e;     
char   demon[MAXSIZE];

/* 类型及其基本操作*/   
typedef   struct   
{   
        selemType   *base; 
        selemType   *top; 
        int   stacksize; 
}sqstack;     
status   initstack   (sqstack   *s) 
{     
        s->base=(selemType   *)malloc(stack_init_size*sizeof(selemType));     
        if(!s->base)   exit   (OVERFLOW); 
        s->top=s->base; 
        s->stacksize=stack_init_size; 
        return   OK; 
}/*创建栈*/ 
status   push   (sqstack   *s,selemType   e) 
{ 
        if(s->top-s->base>=s->stacksize) 
        { 
                s->base=(elemType*)   realloc(s->base,(s->stacksize+stackincrement)*sizeof(elemType))     
                if(!s->base)   exit(OVERFLOW); 
                s->top=s->base+s->stacksize; 
                s->stacksize+=stackincrement; 
        } 
        *(s->top++)=e; 
        return   OK; 
}/*入栈*/ 
status   pop(sqstack   *s,selemType   *e) 
{     
        if(s->top==s->base)   return   ERROR; 
        *e=*(--(s->top)); 
        return   OK; 
}/*出栈*/ 
/*队列类型及其基本操作*/ 
typedef   struct   qnode 
{ 
        qelemType   data; 
        struct   qnode   *next; 
}qnode,*queueptr; 
typedef   struct 
{ 
        queueptr   front; 
        queueptr   rear; 
}linkqueue; 
status   initqueue(linkqueue   *q) 
{ 
        q->front=q->rear=(queueptr)malloc(sizeof(qnode)); 
        if(!q->front)   exit(OVERFLOW); 
       q->front->next=NULL; 
        return   OK; 
}/*创建队列*/ 
status   enqueue(linkqueue   *q,qelemType   e) 
{ 
        queueptr   p; 
        p=(queueptr)malloc(sizeof(qnode)); 
        if(!p)   exit(OVERFLOW); 
        p->data=e; 
        p->next=NULL; 
       <font color="#ff0000">q->rear->next=p; </font>
        q->rear=p; 
        return   OK; 
}/*入队*/ 
status   dequeue(linkqueue   *q,qelemType   *e) 
{ 
        queueptr   p; 
        if(q->front==q->rear)   return   ERROR; 
        p=q->front->next; 
        *e=p->data; 
      <font color="#ff0000"> q->front->next=p->next; </font>
        if(q->rear==p) 
        { 
                q->rear=q->front; 
        } 
        free(p);
        return   OK;
}/*出队*/ 
/*括号内元素入栈处理函数*/
void   tempstack(sqstack   *temps) 
{ 
        int   i=0; 
        char   t; 
        char   c;
        c=demon;
        for(i=0;c!='#';i++)/*遍历数组*/
        {
                c=demon;
                if(c=='(')/*遇到开括号*/
                {
                        t=demon[i+1];/*取括号中的首字母*/
                        push(temps,t);/*入栈*/
                        i++;/*指向首字母*/
                        do 
                        { 
                                i++; 
                                c=demon; 
                                push(temps,c)/*第一次循环将次字母入栈*/; 
                                push(temps,t);/*再将首字母进栈*/ 
                        }while(c!=')');/*直到括号中元素全部进栈*/ 
                        pop(temps,&t);/*将多余进栈的首字母t出栈*/ 
                        pop(temps,&t);   /*将多余进栈的')'出栈*/ 
                } 
        } 
}/*临时栈*/ 

/*特殊入队函数*/
void   spenqueue(linkqueue   *q,char   key)     
{     
        int   j=0;
        char   a[5]; 
        switch(key)   /*判断大写字母对应的字符串*/ 
        { 
        case'A':strcpy(a,"ase");break; 
        case'B':strcpy(a,"tAdA");break;
        case'C':strcpy(a,"abc");break; 
        case'D':strcpy(a,"def");break; 
        case'E':strcpy(a,"ghi");break; 
        case'F':strcpy(a,"klm");break; 
        case'H':strcpy(a,"mop");break; 
        default:strcpy(a,"???");   /*不能翻译的魔王语言以"???"输出*/ 
        } 
        while(a[j]!='\0')   /*如果数组还有字母*/ 
        { 
                enqueue(q,a[j]);/*进队*/ 
                j++; 
        } 
}/*特殊入队*/ 
/*排序入队处理函数*/ 
status   sort(sqstack   *s,linkqueue   *q) 
{     
        qnode   b; 
        int   flag=0;/*大写字母监视哨置零*/ 
        int   i; 
        for(i=0;demon[   i]!='#';i++)/*遍历数组*/ 
        { 
                b.data=demon[   i]; 
                if(   ('a'<=b.data&&b.data<='z')||b.data=='?')   /*如果是小写字母或者'?' 则直接进栈*/     
                { 
                        enqueue(q,b.data); 
                } 
                else 
                { 
                        if('A'<=b.data&&b.data<='Z')   /*如果是大写字母,则调用特殊进栈函数,*/     
                        { 
                                spenqueue(q,b.data); 
                                flag=1;   /*发现大写字母监视哨置1*/ 
                        } 
                        else 
                        { 
                                if(b.data=='(')/*如果是括号*/ 
                                {
                                        do 
                                        { 
                                                pop(s,&e); 
                                                enqueue(q,e); 
                                        }while(!(s->top==s->base));   /*只要栈不为空,则出栈进队*/     
                                        while   (b.data!=')')   /*只要还指向括号内元素,就继续往后移,保证原括号内的元素不再进栈*/ 
                                        { 
                                                i++; 
                                                b.data=demon; 
                                        } 
                                } 
                        } 
                } 
        }
        return   flag; 
}/*排序*/
/*主函数*/
status   main() 
{ 
        sqstack   s1; 
        linkqueue   q1; 
        int   k=0; 
        int   flag=1; 
        clrscr(); 
        printf("Please   Input   the   Demon's   Words:\n"); 
        printf("!:   Less   Than   30   Letters:   )\n"); 
        printf("!:   End   with   '#':   )\n\t"); 
        scanf("%s",demon);
        printf("\n***************************************"); 
        initstack(&s1);   /*创建栈*/ 
        initqueue(&q1);   /*创建队*/ 
        tempstack(&s1);   /*调用函数*/ 
        while   (flag==1)   /*如果有大写字母*/ 
        { 
                k=0; 
                flag=sort(&s1,&q1); 
                while(q1.front!=q1.rear)   /*重写demon[i   ]*/ 
                { 
                        dequeue(&q1,&e); 
                        demon[k]=e;
                        k++;
                }
                demon[k]='#';
        }
        demon[k]='\0';
        printf("\n***************************************");
        printf("\nThe   Human   Words:\n\t%s",demon);
        printf("\n***************************************");
}
[i][i][i]
---------------------------------------------------------------------------------------------------------------------------------------
以上是别人的写法;
平时定义一个结构体变量的是:
struck arg{int a; int b;}ARG   struck arg *point; point->a;这种-> 的写法是一个指向;
而上面的链表数据为什么有连续的->x->x1->x2的写法呢?
其中上面的一个范例过程源码写法:q->front->next=p->next;   是什么意义?有和数据的指向?

[/i][/i][/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-5 15:14:30 | 显示全部楼层
q->front->next=p->next;  你可以简单的理解为q的前节点指向的后节点原本是q现在 把它改成了指向p的后节点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-11-5 15:20:13 | 显示全部楼层
本帖最后由 text6789 于 2014-11-5 15:36 编辑
machimilk 发表于 2014-11-5 15:14
q->front->next=p->next;  你可以简单的理解为q的前节点指向的后节点原本是q现在 把它改成了指向p的后节点

这样的一个写法读:
1:q->front;//先这样的数据为知道?还是
2:q->front->next;还不能会意您的意思;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-5 17:03:27 | 显示全部楼层
machimilk 发表于 2014-11-5 15:14
q->front->next=p->next;  你可以简单的理解为q的前节点指向的后节点原本是q现在 把它改成了指向p的后节点

不错,到今天理解了,门外汉站了好久才知道这个循环链表里面的q->font->next指针指向的节点的下一个节点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 17:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表