1. 程式人生 > >《破損的鍵盤》連結串列

《破損的鍵盤》連結串列

題目

你有一個破損的鍵盤。鍵盤上的所有鍵都可以正常工作,但有時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");
	}
	
}