鱼C论坛

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

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

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

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

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

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

  5. /*定义全局变量*/
  6. #define   TRUE   1
  7. #define   FALSE   0
  8. #define   OK   1
  9. #define   ERROR   0
  10. #define   NULL   0
  11. #define   OVERFLOW   -2
  12. #define   MAXSIZE   100
  13. #define   stack_init_size   100
  14. #define   stackincrement   10
  15. typedef   char   selemType;
  16. typedef   char   qelemType;
  17. typedef   char   elemType;
  18. typedef   int   status;
  19. char   e;     
  20. char   demon[MAXSIZE];

  21. /* 类型及其基本操作*/   
  22. typedef   struct   
  23. {   
  24.         selemType   *base;
  25.         selemType   *top;
  26.         int   stacksize;
  27. }sqstack;     
  28. status   initstack   (sqstack   *s)
  29. {     
  30.         s->base=(selemType   *)malloc(stack_init_size*sizeof(selemType));     
  31.         if(!s->base)   exit   (OVERFLOW);
  32.         s->top=s->base;
  33.         s->stacksize=stack_init_size;
  34.         return   OK;
  35. }/*创建栈*/
  36. status   push   (sqstack   *s,selemType   e)
  37. {
  38.         if(s->top-s->base>=s->stacksize)
  39.         {
  40.                 s->base=(elemType*)   realloc(s->base,(s->stacksize+stackincrement)*sizeof(elemType))     
  41.                 if(!s->base)   exit(OVERFLOW);
  42.                 s->top=s->base+s->stacksize;
  43.                 s->stacksize+=stackincrement;
  44.         }
  45.         *(s->top++)=e;
  46.         return   OK;
  47. }/*入栈*/
  48. status   pop(sqstack   *s,selemType   *e)
  49. {     
  50.         if(s->top==s->base)   return   ERROR;
  51.         *e=*(--(s->top));
  52.         return   OK;
  53. }/*出栈*/
  54. /*队列类型及其基本操作*/
  55. typedef   struct   qnode
  56. {
  57.         qelemType   data;
  58.         struct   qnode   *next;
  59. }qnode,*queueptr;
  60. typedef   struct
  61. {
  62.         queueptr   front;
  63.         queueptr   rear;
  64. }linkqueue;
  65. status   initqueue(linkqueue   *q)
  66. {
  67.         q->front=q->rear=(queueptr)malloc(sizeof(qnode));
  68.         if(!q->front)   exit(OVERFLOW);
  69.        q->front->next=NULL;
  70.         return   OK;
  71. }/*创建队列*/
  72. status   enqueue(linkqueue   *q,qelemType   e)
  73. {
  74.         queueptr   p;
  75.         p=(queueptr)malloc(sizeof(qnode));
  76.         if(!p)   exit(OVERFLOW);
  77.         p->data=e;
  78.         p->next=NULL;
  79.        <font color="#ff0000">q->rear->next=p; </font>
  80.         q->rear=p;
  81.         return   OK;
  82. }/*入队*/
  83. status   dequeue(linkqueue   *q,qelemType   *e)
  84. {
  85.         queueptr   p;
  86.         if(q->front==q->rear)   return   ERROR;
  87.         p=q->front->next;
  88.         *e=p->data;
  89.       <font color="#ff0000"> q->front->next=p->next; </font>
  90.         if(q->rear==p)
  91.         {
  92.                 q->rear=q->front;
  93.         }
  94.         free(p);
  95.         return   OK;
  96. }/*出队*/
  97. /*括号内元素入栈处理函数*/
  98. void   tempstack(sqstack   *temps)
  99. {
  100.         int   i=0;
  101.         char   t;
  102.         char   c;
  103.         c=demon;
  104.         for(i=0;c!='#';i++)/*遍历数组*/
  105.         {
  106.                 c=demon;
  107.                 if(c=='(')/*遇到开括号*/
  108.                 {
  109.                         t=demon[i+1];/*取括号中的首字母*/
  110.                         push(temps,t);/*入栈*/
  111.                         i++;/*指向首字母*/
  112.                         do
  113.                         {
  114.                                 i++;
  115.                                 c=demon;
  116.                                 push(temps,c)/*第一次循环将次字母入栈*/;
  117.                                 push(temps,t);/*再将首字母进栈*/
  118.                         }while(c!=')');/*直到括号中元素全部进栈*/
  119.                         pop(temps,&t);/*将多余进栈的首字母t出栈*/
  120.                         pop(temps,&t);   /*将多余进栈的')'出栈*/
  121.                 }
  122.         }
  123. }/*临时栈*/

  124. /*特殊入队函数*/
  125. void   spenqueue(linkqueue   *q,char   key)     
  126. {     
  127.         int   j=0;
  128.         char   a[5];
  129.         switch(key)   /*判断大写字母对应的字符串*/
  130.         {
  131.         case'A':strcpy(a,"ase");break;
  132.         case'B':strcpy(a,"tAdA");break;
  133.         case'C':strcpy(a,"abc");break;
  134.         case'D':strcpy(a,"def");break;
  135.         case'E':strcpy(a,"ghi");break;
  136.         case'F':strcpy(a,"klm");break;
  137.         case'H':strcpy(a,"mop");break;
  138.         default:strcpy(a,"???");   /*不能翻译的魔王语言以"???"输出*/
  139.         }
  140.         while(a[j]!='\0')   /*如果数组还有字母*/
  141.         {
  142.                 enqueue(q,a[j]);/*进队*/
  143.                 j++;
  144.         }
  145. }/*特殊入队*/
  146. /*排序入队处理函数*/
  147. status   sort(sqstack   *s,linkqueue   *q)
  148. {     
  149.         qnode   b;
  150.         int   flag=0;/*大写字母监视哨置零*/
  151.         int   i;
  152.         for(i=0;demon[   i]!='#';i++)/*遍历数组*/
  153.         {
  154.                 b.data=demon[   i];
  155.                 if(   ('a'<=b.data&&b.data<='z')||b.data=='?')   /*如果是小写字母或者'?' 则直接进栈*/     
  156.                 {
  157.                         enqueue(q,b.data);
  158.                 }
  159.                 else
  160.                 {
  161.                         if('A'<=b.data&&b.data<='Z')   /*如果是大写字母,则调用特殊进栈函数,*/     
  162.                         {
  163.                                 spenqueue(q,b.data);
  164.                                 flag=1;   /*发现大写字母监视哨置1*/
  165.                         }
  166.                         else
  167.                         {
  168.                                 if(b.data=='(')/*如果是括号*/
  169.                                 {
  170.                                         do
  171.                                         {
  172.                                                 pop(s,&e);
  173.                                                 enqueue(q,e);
  174.                                         }while(!(s->top==s->base));   /*只要栈不为空,则出栈进队*/     
  175.                                         while   (b.data!=')')   /*只要还指向括号内元素,就继续往后移,保证原括号内的元素不再进栈*/
  176.                                         {
  177.                                                 i++;
  178.                                                 b.data=demon;
  179.                                         }
  180.                                 }
  181.                         }
  182.                 }
  183.         }
  184.         return   flag;
  185. }/*排序*/
  186. /*主函数*/
  187. status   main()
  188. {
  189.         sqstack   s1;
  190.         linkqueue   q1;
  191.         int   k=0;
  192.         int   flag=1;
  193.         clrscr();
  194.         printf("Please   Input   the   Demon's   Words:\n");
  195.         printf("!:   Less   Than   30   Letters:   )\n");
  196.         printf("!:   End   with   '#':   )\n\t");
  197.         scanf("%s",demon);
  198.         printf("\n***************************************");
  199.         initstack(&s1);   /*创建栈*/
  200.         initqueue(&q1);   /*创建队*/
  201.         tempstack(&s1);   /*调用函数*/
  202.         while   (flag==1)   /*如果有大写字母*/
  203.         {
  204.                 k=0;
  205.                 flag=sort(&s1,&q1);
  206.                 while(q1.front!=q1.rear)   /*重写demon[i   ]*/
  207.                 {
  208.                         dequeue(&q1,&e);
  209.                         demon[k]=e;
  210.                         k++;
  211.                 }
  212.                 demon[k]='#';
  213.         }
  214.         demon[k]='\0';
  215.         printf("\n***************************************");
  216.         printf("\nThe   Human   Words:\n\t%s",demon);
  217.         printf("\n***************************************");
  218. }
复制代码

[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]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-5 15:14:30 | 显示全部楼层
q->front->next=p->next;  你可以简单的理解为q的前节点指向的后节点原本是q现在 把它改成了指向p的后节点
小甲鱼最新课程 -> https://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;还不能会意您的意思;
小甲鱼最新课程 -> https://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指针指向的节点的下一个节点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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