廣義表的建立與基本操作(15分) 成績: 15 / 折扣: 0.8 在本實驗中,需要同學們實現以下廣義表的操作: 1. Status CreateGList(GList &L, char *S) // 根據字串 S 表示的廣義表內容建立廣義表資料結構; 2. GList GetHead(GList L) // 取表頭運算 3. GList GetTail(GList L) // 取表尾運算 4. void DestroyGList(GList &L) // 銷毀廣義表 L 5. void PrintGList(GList L) // 顯示廣義表 L 內容 程式運行時,首先輸入一個廣義表,表中的原子是小寫字母。隨後可以交替輸入取表頭或取表尾指令(分別用 1 和 2 表示),取的結果替代當前廣義表,並釋放相應的資源(需將釋放資源資訊輸出)。當廣義表是空或是原子時,程式停止運行。 例: (下面的黑體為輸入) ((a,()),c,d) generic list (a,()),c,d) 1 destroy tail free list node generic list a,()) 2 free head node free list node generic list ()) 1 destroy tail free list node generic list ) |
#include <stdio.h>#include <stdlib.h>#include <string.h>void GetHead(char glist[100]){ int i,len,kuo=0; len = strlen(glist); for (i = 1;i < len;i++) { if (glist[i] == '(') { glist[i-1]=glist[i]; kuo++; continue; } else if (glist[i] == ')' && kuo != 0) { glist[i-1]=glist[i]; kuo--; continue; } else if (glist[i] == ',' && kuo == 0) { glist[i-1]='\0'; break; } else if (i == len-1) { glist[i-1]='\0'; break; } glist[i-1]=glist[i]; }}void GetTail(char glist[100]){ int i,j,k=1,len,kuo; char gtemp[100]; gtemp[0] = '('; len=strlen(glist); for (i=1,kuo=0;i<len;i++) { if (glist[i] == '(') { kuo++; } else if (glist[i] == ')' && kuo != 0) { kuo--; } else if (glist[i] == ',' && kuo == 0) { i++; break; } } if (i == len) { gtemp[k++]=')'; gtemp[k]='\0'; strcpy(glist,gtemp); return; } for (j=i,k=1;j<=len;j++) { gtemp[k++]=glist[j]; } strcpy(glist,gtemp);}void main(){ int i,j,k,type; char glist[100]; gets(glist); printf("generic list: "); puts(glist); while (glist) { if (strcmp(glist,"()") == 0 || glist[1] == '\0') { break; } scanf("%d",&type); switch(type) { case 1: GetHead(glist); printf("destroy tail\n"); printf("free list node\n"); printf("generic list: "); puts(glist); break; case 2: GetTail(glist); printf("free head node\n"); printf("free list node\n"); printf("generic list: "); puts(glist); break; } }}