1. 程式人生 > >資料結構(棧子系統:c實現)

資料結構(棧子系統:c實現)

#include<stdio.h>
#include<stdlib.h>
#define N sizeof(stacknode)//結點所佔位元組數 N

//定義結構體
typedef int datatype;
typedef struct stacknode
{
	datatype data;
	struct stacknode *next;
}stacknode;

//定義棧頂
typedef struct 
{
	stacknode *top;
	int count;//計數用
}linkstack;


//進棧,元素一一進棧
void InsertStack(linkstack *s)
{

	int x=0;
	stacknode *p;
	s->top=NULL;
	s->count=0;
	//printf("\n\t建立一個棧子系統");
	p=(stacknode*)malloc(N);
	printf("\n\t\t請逐個輸入數字,結束標記位,做結束符的數字: 0     \n");
	while(1)
	{
		/*printf("\t\t請輸入:");
		fflush(stdin);
		
		if(!scanf("%d",&x))
		{
			printf("輸入的元素種類錯誤!!!\n");
			continue;
		}
		else if(x=='#') break;
		else
		{
			p->data=x;
			p->next=s->top;
			s->top=p;
			s->count++;
		}
		*/
		printf("\t\t請輸入:");
		p=(stacknode*)malloc(N);
		fflush(stdin);
		if(!scanf("%d",&x))
		{
			printf("\t\t\t輸入的“元素“種類錯誤!!!\n");
			continue;
		}
		else if(x==0)
			break;
		else
		{
			
			p->data=x;
			p->next=s->top;
			s->top=p;
			s->count++;
		}
	}
	printf("\n");
	
}


//顯示棧中元素
void ShowStack(linkstack *s)
{
	stacknode *p;
	int i=0;
	p=s->top;
	i=s->count;
	//p->data=s->top->data;
	//if(p->next==NULL)
	if(i==0)
	printf("\t\t棧是一個空棧!!!!\n");
	else
	{
		printf("\t棧中各個元素為:\t");
		while(i!=0)
		{
			printf("%8d",p->data);
			p=p->next;
			//s->top=s->top->next;
			i--;
		}
	}
	printf("\n");
}


//求棧中元素的個數
void LengthStack(linkstack *s)
{
	printf("\t棧中元素的個數為:\t");
	printf("%d",s->count);
}


//出棧,棧中各個元素的出棧
void PutStack(linkstack *s)
{
	//int x;
	stacknode *p;
	//linkstack *i;
	if(s->count==0)
	{
		printf("\t\t棧是一個空棧!!!!");
	//	return 0;
	}
	else
	{
		/*
		p=s->top;
		x=p->data;
		s->top=p->next;
		free(p);
		//s->count-=1;
		*/
		p=s->top;
		s->top=s->top->next;
		printf("\n\t\t\t\t出棧元素為:		%d\n",p->data);
		free(p);
		s->count--;
	}
}


//數制轉換,十進位制轉換為二進位制
void ShiftStack(linkstack *s)
{
	int z=0;
	int m=0;
	stacknode *p;
	printf("請輸入所要轉換的 ”數字“ Z:\t");
	scanf("%d",&z);
	s->top=NULL;
	while(z)
	{
		m=z%2;
		z=z/2;
		p=(stacknode*)malloc(N);
		p->next=s->top;
		s->top=p;
		s->top->data=m;
	}
	printf("\n\t轉化後的二進位制為\t");
	while(s->top)
	{
		p=s->top;
		printf("%d",p->data);
		s->top=s->top->next;
		free(p);
	}
	printf("\n");		
}




int main()
{
	int a;
	linkstack s;
	s.count=0;
	//linkstack *s;
	while(1)
    {
		printf("                        \n\t\t\t\t\t\t棧子系統\n");
		printf("            \t\t***************************************************\n");
		printf("            \t\t*               1------進    棧                   *\n");
		printf("            \t\t*               2------出    棧                   *\n");
		printf("            \t\t*               3------顯示棧中元素               *\n");
		printf("            \t\t*               4------求棧中元素個數             *\n");
		printf("            \t\t*               5------數制轉換                   *\n");
		printf("            \t\t*               0------返    回                   *\n");
		printf("            \t\t***************************************************\n");
		printf("            請輸入(0-5)選項:\n");
        printf("\n請輸入所要達到第幾號功能:\t");
		fflush(stdin);
		scanf("%d",&a);
        if(a == 1)
            InsertStack(&s);
        else if(a == 2)
            PutStack(&s);
        else if(a == 3)
            ShowStack(&s);
        else if(a == 4)
           LengthStack(&s);
        else if(a == 5)
            ShiftStack(&s);
        else if(a == 0)
            return 0;
        else{
            printf("!!!!!輸入有誤,請重新輸入!!!!!\n"); 
	}
 } 
}