数据结构实验
实验内容和目的:
掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。学习基本的查和排序技术。让我们在实际上机中具有编制相当规
模的程序的能力。养成一种良好的程序设计风格。
 
实验教材:
数据结构题集(C语言版) 清华大学出版社  2007
实验项目:
实验一、栈和循环队列
实验内容:
1
    掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。本程序采用的是链栈结构,具有初始化一个栈、PUSHPOP、显示所有栈里的元素四个功能。
2 循环队列
    掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。
、实验代码
1
程序代码:
#include <stdio.h>
#include <malloc.h>
#define Stack_Size 6
#define ERROR 0
#define OK 1
typedef int SElemType;
typedef struct SNode
{
    SElemType data;
    struct SNode *next;
}SNode,*LinkStack;
int CreatTwo(LinkStack &head,int n)
{
    int i;
    SNode *p;
    head=(LinkStack)malloc(sizeof(SNode));
    head->next=NULL;
    printf("请输入数据(数字):\n");
    for(i=n;i>0;--i)
    {
        p=(SNode *)malloc(sizeof(SNode));
        scanf("%d",&p->data);
        p->next=head->next;
        head->next=p;
    }
    return 1;
}
int menu_select()
{
    int sn;
    for(;;)
    {
        scanf("%d",&sn);
        if(sn<1||sn>6)
            printf("\n\t输入错误,请重新输入\n");
        else
            break;
    }
    return sn;
}
int Push(LinkStack &top,SElemType e)
{
    SNode *q;
    q=(LinkStack)malloc(sizeof(SNode));
    if(!q)
    {
        printf("溢出!\n");
        return(ERROR);
    }
    q->data=e;
    q->next=top->next;
    top->next=q;
    return(OK);
}
int Pop(LinkStack &top,SElemType &e)
{
    SNode *q;
    if(!top->next)
    {printf("error!\n");
    return(ERROR);}
    e=top->next->data;
    q=top->next;
    top->next=q->next;
    free(q);
    return(OK);
}
void main()
{  int e;
    LinkStack top;
    printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n");
    while(1)
c语言二维数组转置    {
        switch(menu_select())
        {
        case 1:
            if(CreatTwo(top,Stack_Size))printf("Success!\n");break;
        case 2:
            printf("Push:\n");
            scanf("%d",&e);
            if(Push(top,e))printf("Success!\n");
            break;
        case 3:
            if(Pop(top,e))printf("Success!\n");
            printf("%d\n",e);
            break;
        case 4:
            LinkStack p;
            printf("所有栈里的元素:\n");
            p=top;
            while(p->next)
            {p=p->next;
            printf("%7d",p->data);
            }
            printf("\n");
            break;
        case 5:
            return;
        }
    }
}
运行结果:
2 循环队列
程序代码:
#include<stdlib.h>
#include<stdio.h>
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef struct
{
    int *elem;//队列存储空间
    int front;
    int rear;
}SqQueue;
//判断选择是否正确
int menu_select()
{
    int sn;
    for(;;)
    {
        scanf("%d",&sn);
        if(sn<1||sn>6)
            printf("\n\t输入错误,请重新输入\n");
        else
            break;
    }
    return sn;
}
//参数(传出)SqQueue &Q,循环队列()
int InitQueue(SqQueue &Q)
{
    Q.elem=(int *)malloc(MAXSIZE*sizeof(int));
    if(!Q.elem)exit(OVERFLOW);
    Q.ar=-1;
    for(int i=0;i<MAXSIZE;i++)
        Q.elem[i]=-1;
    return OK;
}
//返回Q的元素个数
int QueueLength(SqQueue Q)
{
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//显示队列的元素
void Display(SqQueue Q)
{
    for(int i=0;i<=QueueLength(Q);i++)
        if(Q.elem[i]!=-1)printf("%d    ",Q.elem[i]);