struct node* merg(struct node* a,struct node* b) { struct node* result=NULL; if(a==NULL) return b; else if(b==NULL) return a; if(a->data<=b->data) { result=a; result->next=merg(a->next,b); } else { result=b; result->next=merg(b->next,a); } return (result); }
int main() { struct node* a=NULL; struct node* b=NULL; struct node* c=NULL; push(&a,50);push(&a,45);push(&a,40);push(&a,35);push(&a,30);push(&a,25);push(&a,20);push(&a,15); prin(a); push(&b,49);push(&b,46);push(&b,38);push(&b,25);push(&b,23);push(&b,13); prin(b); c=merg(a,b); prin(c); return 0; }
void merg_sort (int *a, int low, int upper) { if (a == NULL) { return; } if (low > upper) { return; } if ((upper - low) <= 1) { return; } else { int mid ; mid = low + ((upper - low) / 2 ); merg_sort (a, low, mid); merg_sort (a, mid, upper); merg (a, low, mid, upper); } return; }
// 11.1 ver1.1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" /* int _tmain(int argc, _TCHAR* argv[]) { return 0; } */ /****************************************************/ /* pas.c */ /* 高级语言到四元式 */ /****************************************************/ #include "stdio.h" #include "string.h" #include "time.h" #include "conio.h" #include "stdlib.h" void my_delay(unsigned long ms) { double start_time = (double)clock() / CLOCKS_PER_SEC * 1000; while ( (double)clock() / CLOCKS_PER_SEC * 1000 - start_time < ms ) ; } #define ACC -2 /****************************************/ #define sy_if 0 #define sy_then 1 #define sy_else 2 #define sy_while 3 #define sy_begin 4 #define sy_do 5 #define sy_end 6 #define a 7 #define semicolon 8 #define e 9 #define jinghao 10 #define S 11 #define L 12 #define tempsy 15 #define EA 18 /*E and*/ #define EO 19 /*E or*/ #define plus 34 #define minus 35 //添加 减号的关键字 #define times 36 #define division 37 //添加 除号的关键字 #define becomes 38 #define op_and 39 #define op_or 40 #define op_not 41 #define rop 42 #define lparent 48 #define rparent 49 #define ident 56 #define intconst 57 /******************************************/ char ch = '\0'; /*当前字符*/ int count = 0; static char spelling[10] = {""}; /*存放识别的字*/ static char line[81] = {""}; /*一行字符缓冲区*/ char *pline;/*字符缓冲区指针*/ char ch_exit; static char ntab1[100][10]; struct ntab { int tc; int fc; } ntab2[200]; int label = 0; /*存放临时变量的表的定义 */ struct rwords { char sp[10]; int sy; }; /*存放文件的结构*/ struct rwords reswords[10] = {{"if", sy_if}, {"do", sy_do}, {"else", sy_else}, {"while", sy_while}, {"then", sy_then}, {"begin", sy_begin}, {"end", sy_end}, {"and", op_and}, {"or", op_or}, {"not", op_not} }; struct aa { int sy1; int pos; } buf[1000], /*词法分析结果缓冲区*/ n,/*当前字符*/ n1,/*当前表达式中的字符*/ E,/*非终结符*/ sstack[100],/*符号栈*/ ibuf[100], stack[1000]; struct aa oth; struct fourexp { char op[10]; struct aa arg1; struct aa arg2; int result; } fexp[200]; /*四元式的结构*/ int ssp = 0; /*指向sstack[100]*/ struct aa *pbuf = buf; /*指向词法分析缓冲区*/ int nlength = 0; int lnum = 0; /*源程序长度*/ int tt1 = 0; FILE *cfile; FILE *mfile; /*********************************************************/ int newt = 0; /*临时变量*/ int nxq = 100; /*nxq指向下一个形成的四元式的地址*/ int lr; int lr1; int sp = 0; /* 状态栈定义*/ int stack1[100]; int sp1 = 0; /*状态栈1的定义*/ int num = 0; struct ll { int nxq1; int tc1; int fc1; } labelmark[10]; int labeltemp[10]; int pointmark = -1, pointtemp = -1; int sign = 0; /*sign=1,表达式为赋值语句;sign=2,表达式为布尔表达式。*/ /***********************************************/ static int action[19][13] = /*0*/ {{2, -1, -1, 3, 4, -1, -1, 5, -1, -1, 10, 1, -1}, /*1*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ACC, -1, -1}, /*2*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1}, /*3*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1}, /*4*/ {2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 9, 8}, /*5*/ { -1, -1, 104, -1, -1, -1, 104, -1, 104, -1, 104, -1, -1}, /*6*/ { -1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*7*/ { -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1}, /*8*/ { -1, -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -1, -1}, /*9*/ { -1, -1, -1, -1, -1, -1, 105, -1, 13, -1, -1, -1, -1}, /*10*/ {2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 14, -1}, /*11*/ {2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 15, -1}, /*12*/ { -1, -1, 103, -1, -1, -1, 103, -1, 103, -1, 103, -1, -1}, /*13*/ {2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 9, 16}, /*14*/ { -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*15*/ { -1, -1, 102, -1, -1, -1, 102, -1, 102, -1, 102, -1, -1}, /*16*/ { -1, -1, -1, -1, -1, -1, 106, -1, -1, -1, -1, -1, -1}, /*17*/ {2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 18, -1}, /*18*/ { -1, -1, 101, -1, -1, -1, 101, -1, 101, -1, 101, -1, -1} }; //下面的是添加了减法和除法的算术表达式SLR矩阵 static int action1[14][9] = /*0*/ {{3, -1, -1, -1, -1, 2, -1, -1, 1}, /*1*/ { -1, 4, 5, 6, 7, -1, -1, ACC, -1}, /*2*/ {3, -1, -1, -1, -1, 2, -1, -1, 8}, /*3*/ { -1, 106, 106, 106, 106, -1, 106, 106, -1}, /*4*/ {3, -1, -1, -1, -1, 2, -1, -1, 9}, /*5*/ {3, -1, -1, -1, -1, 2, -1, -1, 10}, /*6*/ {3, -1, -1, -1, -1, 2, -1, -1, 11}, /*7*/ {3, -1, -1, -1, -1, 2, -1, -1, 12}, /*8*/ { -1, 4, 5, 6, 7, -1, 13, -1, -1}, /*9*/ { -1, 101, 5, 101, 7, -1, 101, 101, -1}, /*10*/ { -1, 102, 102, 102, 102, -1, 102, 102, -1}, /*11*/ { -1, 103, 5, 103, 7, -1, 103, 103, -1}, /*12*/ { -1, 104, 104, 104, 104, -1, 104, 104, -1}, /*13*/ { -1, 105, 105, 105, 105, -1, 105, 105, -1} }; static int action2[16][11] = /*0*/ {{1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8}, /*1*/ { -1, 2, -1, 101, -1, 101, 101, 101, -1, -1, -1}, /*2*/ {3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*3*/ { -1, -1, -1, 102, -1, 102, 102, 102, -1, -1, -1}, /*4*/ {1, -1, 4, -1, 5, -1, -1, -1, 11, 7, 8}, /*5*/ {1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8}, /*6*/ { -1, -1, -1, 104, -1, 9, 10, 104, -1, -1, -1}, /*7*/ {1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8}, /*8*/ {1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8}, /*9*/ {105, -1, 105, -1, 105, -1, -1, 105, -1, -1, -1}, /*10*/ {107, -1, 107, -1, 107, -1, -1, 107, -1, -1, -1}, /*11*/ { -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1}, /*12*/ { -1, 103, -1, 103, -1, 103, 103, 103, -1, -1, -1}, /*13*/ { -1, -1, -1, -1, -1, 9, 10, ACC, -1, -1, -1}, /*14*/ { -1, -1, -1, 106, -1, 9, 10, 106, -1, -1, -1}, /*15*/ { -1, -1, -1, 108, -1, 9, 10, 108, -1, -1, -1} }; /****************从文件读一行到缓冲区***********************************/ void readline() { char ch1; pline = line; ch1 = getc(cfile); while (ch1 != '\n') { //////////////////////////////////////////////////////////////////////////// my_delay(50); printf("%c", ch1); /////////////////////////////////////////////////////////////////////////////// *pline = ch1; pline++; ch1 = getc(cfile); //取下一个字符 } *pline = '\0'; pline = line; printf("\n"); } /*********************************从缓冲区读一个字符************************/ void readch() { if (ch == '\0') { readline(); lnum++; } ch = *pline; pline++; } /****************标志符和关键字的识别************************************/ find(char spel[]) { int ss1 = 0; int ii = 0; while ((ss1 == 0) && (ii < nlength)) { if (!strcmp(spel, ntab1[ii])) ss1 = 1; ii++; } if (ss1 == 1) return ii - 1; else return -1; } void identifier() { int iii = 0, j, k; int ss = 0; k = 0; do { spelling[k] = ch; k++; readch(); } while (((ch >= 'a') && (ch <= 'z')) || ((ch >= '0') && (ch <= '9'))); pline--; spelling[k] = '\0'; while ((ss == 0) && (iii < 10)) { if (!strcmp(spelling, reswords[iii].sp)) ss = 1; iii++; } /*关键字匹配*/ if (ss == 1) { buf[count].sy1 = reswords[iii - 1].sy; } else { buf[count].sy1 = ident; j = find(spelling); if (j == -1) { buf[count].pos = tt1; strcpy(ntab1[tt1], spelling); tt1++; nlength++; } else buf[count].pos = j; } count++; for (k = 0; k < 10; k++) spelling[k] = '\0'; } /*****************数字的识别***********************************/ void number() { int ivalue = 0; int digit; do { digit = ch - '0'; ivalue = ivalue * 10 + digit; readch(); } while ((ch >= '0') && (ch <= '9')); buf[count].sy1 = intconst; buf[count].pos = ivalue; count++; pline--; } /**************扫描主函数*************************************/ void scan() { int i; while (ch != '~') { switch (ch) { case ' ': break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': identifier(); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': number(); break; case '<': readch(); if (ch == '=') { buf[count].pos = 0; } else { if (ch == '>') buf[count].pos = 4; else { buf[count].pos = 1; pline--; } } buf[count].sy1 = rop; count++; break; case '>': readch(); if (ch == '=') { buf[count].pos = 2; } else { buf[count].pos = 3; pline--; } buf[count].sy1 = rop; count++; break; case '(': buf[count].sy1 = lparent; count++; break; case ')': buf[count].sy1 = rparent; count++; break; case '#': buf[count].sy1 = jinghao; count++; break; case '+': buf[count].sy1 = plus; count++; break; case '-': //ex buf[count].sy1 = minus; count++; break; case '/': //ex buf[count].sy1 = division; count++; break; case '*': buf[count].sy1 = times; count++; break; case ':': readch(); if (ch == '=') buf[count].sy1 = becomes; count++; break; case '=': buf[count].sy1 = rop; buf[count].pos = 5; count++; break; case ';': buf[count].sy1 = semicolon; count++; break; } readch(); } buf[count].sy1 = -1; } /******************************************************************/ void readnu() { if (pbuf->sy1 >= 0) { n.sy1 = pbuf->sy1; n.pos = pbuf->pos; pbuf++; } } /******************中间变量的生成**************************/ newtemp() { newt++; return newt; } /**************************生成四元式****************/ gen(char op1[], struct aa arg11, struct aa arg22, int result1) { strcpy(fexp[nxq].op, op1); fexp[nxq].arg1.sy1 = arg11.sy1; fexp[nxq].arg1.pos = arg11.pos; fexp[nxq].arg2.sy1 = arg22.sy1; fexp[nxq].arg2.pos = arg22.pos; fexp[nxq].result = result1; nxq++; return nxq - 1; } /**********布尔表达式的匹配****************/ merg(int p1, int p2) { int p; if (p2 == 0) return p1; else { p = p2; while (fexp[p].result != 0) p = fexp[p].result; fexp[p].result = p1; return p2; } } void backpatch(int p, int t) { int tempq; int q; q = p; while (q != 0) { tempq = fexp[q].result; fexp[q].result = t; q = tempq; } } /*******************************************/ change1(int chan) { switch (chan) { case ident: case intconst: return 0; case plus: return 1; case times: return 2; case minus: //返回减号在 算术表达式SLR表中的 列号 return 3; case division: ///返回除号在 算术表达式SLR表中的 列号 return 4; case lparent: return 5; case rparent: return 6; case jinghao: return 7; case tempsy: return 8; } } change2(int chan) { switch (chan) { case ident: case intconst: return 0; case rop: return 1; case lparent: return 2; case rparent: return 3; case op_not: return 4; case op_and: return 5; case op_or: return 6; case jinghao: return 7; case tempsy: return 8; case EA: return 9; case EO: return 10; } } /************赋值语句的的分析***************************/ void lrparse1(int num) { lr1 = action1[stack1[sp1]][change1(n1.sy1)]; if (lr1 == -1) { printf("\n算术表达式或赋值语句出错!\n"); getch(); exit(0); } if (ibuf[0].sy1 != ident) //对赋值表达式的检查 { printf("\n赋值语句出错!赋值号的左边不是变量名\n"); getch(); exit(0); } if ((lr1 < 14) && (lr1 >= 0)) //14 ――标记算术表达式SLR表中的状态数 { sp1++; stack1[sp1] = lr1; if (n1.sy1 != tempsy) { ssp++; num++; sstack[ssp].sy1 = n1.sy1; sstack[ssp].pos = n1.pos; } n1.sy1 = ibuf[num].sy1; n1.pos = ibuf[num].pos; lrparse1(num); } if ((lr1 >= 100) && (lr1 < 107)) { switch (lr1) { case 100: break; case 101: printf("\nE->E+E 归约\n"); E.pos = newtemp(); gen("+", sstack[ssp - 2], sstack[ssp], E.pos + 100); ssp = ssp - 2; sstack[ssp].sy1 = tempsy; sstack[ssp].pos = E.pos; sp1 = sp1 - 3; break; /*E->E+E*/ case 102: printf("\nE->E*E 归约\n"); E.pos = newtemp(); gen("*", sstack[ssp - 2], sstack[ssp], E.pos + 100); ssp = ssp - 2; sstack[ssp].sy1 = tempsy; sstack[ssp].pos = E.pos; sp1 = sp1 - 3; break; /*E->E*E*/ case 103: //添加的 对减法归约的语义代码 printf("\nE->E-E 归约\n"); E.pos = newtemp(); gen("-", sstack[ssp - 2], sstack[ssp], E.pos + 100); ssp = ssp - 2; sstack[ssp].sy1 = tempsy; sstack[ssp].pos = E.pos; sp1 = sp1 - 3; break; /*E->E-E*/ case 104: //添加的 对除法归约的语义代码 printf("\nE->E/E 归约\n"); E.pos = newtemp(); gen("/", sstack[ssp - 2], sstack[ssp], E.pos + 100); ssp = ssp - 2; sstack[ssp].sy1 = tempsy; sstack[ssp].pos = E.pos; sp1 = sp1 - 3; break; /*E->E/E*/ case 105: printf("\nE->(E) 归约\n"); E.pos = sstack[ssp - 1].pos; ssp = ssp - 2; sstack[ssp].sy1 = tempsy; sstack[ssp].pos = E.pos; sp1 = sp1 - 3; break; /*E->(E)*/ case 106: printf("\nE->i 归约\n"); E.pos = sstack[ssp].pos; sp1--; break; /*E->i*/ } n1.sy1 = tempsy; /*规约后为非终结符*/ n1.pos = E.pos; lrparse1(num); } if ((lr1 == ACC) && (stack1[sp1] == 1)) { /*归约A->i:=E*/ printf("\nA->i:=E 归约\n"); gen(":=", sstack[ssp], oth, ibuf[0].pos); ssp = ssp - 3; sp1 = sp1 - 3; } } /*********************布尔表达式的分析**************************/ lrparse2(int num) { int templabel; lr1 = action2[stack1[sp1]][change2(n1.sy1)]; if (lr1 == -1) { if (sign == 2) printf("\nwhile语句出错!\n"); if (sign == 3) printf("\nif语句出错!\n"); getch(); exit(0); } if ((lr1 < 16) && (lr1 >= 0)) { sp1++; stack1[sp1] = lr1; ssp++; sstack[ssp].sy1 = n1.sy1; sstack[ssp].pos = n1.pos; if ((n1.sy1 != tempsy) && (n1.sy1 != EA) && (n1.sy1 != EO)) num++; n1.sy1 = ibuf[num].sy1; n1.pos = ibuf[num].pos; lrparse2(num); } if ((lr1 >= 100) && (lr1 < 109)) { switch (lr1) { case 100: break; case 101: ntab2[label].tc = nxq; ntab2[label].fc = nxq + 1; gen("jnz", sstack[ssp], oth, 0); gen("j", oth, oth, 0); sp1--; ssp--; label++; n1.sy1 = tempsy; break; /*E->i*/ case 102: ntab2[label].tc = nxq; ntab2[label].fc = nxq + 1; switch (sstack[ssp - 1].pos) { case 0: gen("j<=", sstack[ssp - 2], sstack[ssp], 0); break; case 1: gen("j<", sstack[ssp - 2], sstack[ssp], 0); break; case 2: gen("j>=", sstack[ssp - 2], sstack[ssp], 0); break; case 3: gen("j>", sstack[ssp - 2], sstack[ssp], 0); break; case 4: gen("j<>", sstack[ssp - 2], sstack[ssp], 0); break; case 5: gen("j=", sstack[ssp - 2], sstack[ssp], 0); break; } gen("j", oth, oth, 0); ssp = ssp - 3; sp1 = sp1 - 3; label++; n1.sy1 = tempsy; break; /*E->i rop i*/ case 103: label = label - 1; ssp = ssp - 3; sp1 = sp1 - 3; label++; n1.sy1 = tempsy; break; /*E->(E)*/ case 104: label = label - 1; templabel = ntab2[label].tc; ntab2[label].tc = ntab2[label].fc; ntab2[label].fc = templabel; ssp = ssp - 2; sp1 = sp1 - 2; label++; n1.sy1 = tempsy; break; /*E->not E*/ case 105: backpatch(ntab2[label - 1].tc, nxq); label = label - 1; ssp = ssp - 2; sp1 = sp1 - 2; label++; n1.sy1 = EA; break; /*EA->E(1)and*/ case 106: label = label - 2; ntab2[label].tc = ntab2[label + 1].tc; ntab2[label].fc = merg(ntab2[label].fc, ntab2[label + 1].fc); ssp = ssp - 2; sp1 = sp1 - 2; label++; n1.sy1 = tempsy; break; /*E->EA E(2)*/ case 107: backpatch(ntab2[label - 1].fc, nxq); label = label - 1; ssp = ssp - 2; sp1 = sp1 - 2; label++; n1.sy1 = EO; break; case 108: label = label - 2; ntab2[label].fc = ntab2[label + 1].fc; ntab2[label].tc = merg(ntab2[label].tc, ntab2[label + 1].tc); ssp = ssp - 2; sp1 = sp1 - 2; label++; n1.sy1 = tempsy; break; } lrparse2(num); } if (lr1 == ACC) return 1; }