《破損的鍵盤》連結串列
阿新 • • 發佈:2019-02-06
題目
你有一個破損的鍵盤。鍵盤上的所有鍵都可以正常工作,但有時Home鍵或者End鍵會自動按下。你並不知道鍵盤存在這一問題,而是專心地打稿子,甚至連顯示器都沒開啟。當你開啟顯示器之後,展現在你面前的是一段悲劇的文字。你的任務是在開啟顯示器之前計算出這段悲劇文字。對於每組資料,輸出一行,即螢幕上的悲劇文字。
輸入
輸入包含多組資料。每組資料佔一行,包含不超過100000個字母、下劃線、字元“[”或者“]”。其中字元“[”表示Home鍵,“]”表示End鍵。輸入結束標誌為檔案結束符(EOF)。輸入檔案不超過5MB。
輸入樣例
This_is_a_[Beiju]_text [[]][][]
Happy_Birthday_to_Tsinghua_University
樣例輸出
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University
本題涉及的主要是連結串列的插入操作,關鍵是插入位置需要變換。
思路是設定游標,如果在尾部插入,就正常的尾插法,如果需要去頭部插入,就將所插入位置前一個節點設定為游標
再其後插入,直到遇到右括號,回到段尾。
程式碼:
#include<stdio.h> #include<string.h> #include<malloc.h> typedef struct LDataNode{ char x; struct LDataNode *next; }LDataNode; typedef struct LHeadNode{ int count; LDataNode *next; //頭 LDataNode *rear; //尾 }LHeadNode,*LinkList; int InitList(LinkList *head); int TailInsert(LinkList *head,char ch); int LTraverse(LinkList head); int HeadInsert(LinkList *head,char ch); int Lflag(LDataNode *Pointer,char ch); int InitList(LinkList *head)//初始化 { *head =(LinkList)malloc(sizeof(LHeadNode)); LDataNode *vhNode =(LDataNode *)malloc(sizeof(LDataNode)); if(*head==NULL||vhNode==NULL) { return -1;//申請失敗 } vhNode->next=NULL; (*head)->count=0; (*head)->next=vhNode; (*head)->rear=vhNode; return 0; } int TailInsert(LinkList *head,char ch)//段尾插入 { LDataNode* p=(LDataNode *)malloc(sizeof(LDataNode)); p->x=ch; (*head)->rear->next=p; (*head)->rear=p; (*head)->rear->next=NULL; } int Lflag(LDataNode **Pointer,char ch)//游標回到段首 { LDataNode* p=(LDataNode *)malloc(sizeof(LDataNode)); p->x=ch; p->next=(*Pointer)->next; (*Pointer)->next=p; (*Pointer)=(*Pointer)->next; } int LTraverse(LinkList head)//遍歷輸出 { LDataNode *p=head->next->next; while(p) { if(p->x!='['&&p->x!=']') printf("%c",p->x); p=p->next; } } int main() { char a[100]; while(gets(a)) { LinkList head; InitList(&head); LDataNode *Pointer;//游標 Pointer=head->rear; int l=strlen(a); int count=1; for(int i=0;i<l;i++) { if(a[i]=='[') { //游標回到段首 Pointer=head->next; count=0; } if(a[i]==']') { //游標回到段尾 Pointer=head->rear; count=1; } //插入資料 if(count) { TailInsert(&head,a[i]); } else { Lflag(&Pointer,a[i]); } } LTraverse(head);//輸出 printf("\n"); } }