日常作业存档_(:з」∠)_
一.线性表的基本操作
(1) 实验目的
通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的强壮性,熟练掌握通过函数参数返回函数结果的办法。
(2) 实验内容
编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。
(3) 参考界面

(3)验收/测试用例
通过菜单调用各个操作,测试点:
- 没有初始化前进行其他操作,程序是否能控制住;
- 初始化一个顺序表;
- 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1)(即是否在可插入的范围内),正确插入4个数据(1,2)、(1,1)、(3,3);
- 显示顺序表中的数据,屏幕输出1, 2, 3;
- 判空,屏幕输出顺便表非空;
- 顺便表长度,屏幕输出3;
- 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
- 定位,输入:4, 输出:不存在,输入2,输出位置为2;
- 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;
- 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
- 删除,要测位置在【1,3】范围之外的情况和之内的情况;
- 清空操作后再测长度;
- 销毁顺序表
实现代码
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 //初始分配量
#define LISTINCREMENT 10 //线性表存储空间分配量
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
void InitList_Sq(SqList &L)//初始化
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem)
{
printf("分配空间失败!\n");
exit(1);
}
L.length = 0;
L.listsize = LIST_INIT_SIZE;
printf("创建成功!\n");
}
void DestoryList(SqList &L)//销毁
{
if(L.elem)
{
delete L.elem;
printf("销毁成功\n");
}
else
printf("销毁失败\n");
}
void ClearList(SqList &L)//清空
{
if(L.length)
{
L.length = 0;
printf("清空成功!\n");
}
else
printf("无需清空。\n");
}
void IfEmpty(SqList &L)//判断是否为空
{
if(L.length)
{
printf("线性表非空!\n");
}
else
printf("线性表为空。\n");
}
void GetLength(SqList &L)//取线性表长度
{
printf("线性表的长度为 %d \n",L.length);
}
void GetElem(SqList &L,int i,int &e)//取值 第i位的数 为 e
{
if(i < 1||i > L.length)
{
printf("取值失败!\n");
}
else
{
e = L.elem[i-1];
printf("第%d个元素为:%d\n",i,e);
}
}
void PriorElem(SqList &L,ElemType cur_e)//求某个元素对应的前驱
/*输入直接是元素位置,判断有无前驱 有则直接输出elem[i-1])*/
{
int i = cur_e-1,pre;
if(i == 0)
printf("该元素没有前驱。\n");
else if(i <= 0||i >= L.length)
printf("该元素不存在。\n");
else
{
pre = L.elem[i-1];
printf("该元素的前驱为 %d\n",pre);
}
}
void NextElem(SqList &L,ElemType cur_e)//求某个元素对应的后继 原理同上
{
int i = cur_e-1,next;
if(i == L.length-1)
printf("该元素没有后继。\n");
else if(i < 0||i > L.length-1)
printf("该元素不存在。\n");
else
{
next = L.elem[i+1];
printf("该元素的后继为 %d \n",next);
}
}
void ListInsert(SqList &L,int i,int e)//插入 i位置 数值e
{
if(i < 1 ||i > L.length+1)
{
printf("插入失败!\n");
}
else if(L.length == LIST_INIT_SIZE)
{
printf("插入失败!\n");
}
else
{
for(int j = L.length - 1;j >= i - 1;j--)
{
L.elem[j+1] = L.elem[j];
}
L.length++;
L.elem[i-1] = e;
printf("插入成功!\n");
}
}
void ListDelete(SqList &L,int i)//删除指定位置元素
{
if(i < 1||i > L.length)
{
printf("删除失败!\n");
}
int j;
for(j = i;j < L.length;j++)
{
L.elem[j-1] = L.elem[j];
}
--L.length;
printf("删除成功!\n");
}
void TraverseList(SqList L)//遍历输出(显示线性表)
{
int i;
for(i=1;i<=L.length;i++)
{
printf("%d ",L.elem[i-1]);
}
printf("\n");
}
int main()
{
int n,i,e,cur_e;
SqList L;
L.elem = 0;
printf("1----初始化一个线性表\n");
printf("2----销毁线性表\n");
printf("3----清空线性表\n");
printf("4----判断线性表是否为空\n");
printf("5----求线性表长度\n");
printf("6----获取线性表指定位置元素\n");
printf("7----求前驱\n");
printf("8----求后继\n");
printf("9----在线性表指定位置插入元素\n");
printf("10----删除线性表指定位置元素\n");
printf("11----显示线性表\n");
printf("\t退出,输入一个负数!\n");
printf("请输入操作代码:\n");
while(~scanf("%d",&n))
{
if(n < 0)
{
break;
}
if(n == 1)
{
InitList_Sq(L);
}
if(n == 2)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
DestoryList(L);
L.elem = 0;
}
}
if(n == 3)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
ClearList(L);
}
}
if(n == 4)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
IfEmpty(L);
}
}
if(n == 5)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
GetLength(L);
}
}
if(n == 6)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
printf("请输入需要获取的元素的位置:\n");
scanf("%d",&i);
GetElem(L,i,e);
}
}
if(n == 7)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
printf("请输入需要查找前驱的元素位置:\n");
scanf("%d",&cur_e);
PriorElem(L,cur_e);
}
}
if(n == 8)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
printf("请输入需要查找后继的元素位置:\n");
scanf("%d",&cur_e);
NextElem(L,cur_e);
}
}
if(n == 9)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
printf("请输入需要插入的元素的位置和值(输入格式:i,e):\n");
scanf("%d,%d",&i,&e);
ListInsert(L,i,e);
}
}
if(n == 10)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
printf("请输入需要删除的元素的位置:\n");
scanf("%d",&i);
ListDelete(L,i);
}
}
if(n == 11)
{
if(L.elem == 0)
{
printf("未进行初始化\n");
}
else
{
TraverseList(L);
}
}
}
return 0;
}
二.链表的基本操作
(1)实验目的
通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。和实验3对比,掌握线性结构两种不同存储方式的区别。
(2)实验内容
编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。
(3)参考界面

(4)验收/测试用例
同实验一
实现代码
#include <stdio.h>
#include <stdlib.h>
void init()
{
printf("可执行操作有:\n");
for(int i = 0;i < 55;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t1.初始化或重置链表\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t2.销毁链表\t\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t3.链表中数据元素个数\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t4.所指位序的元素值\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t5.链表已存在元素的位序\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t6.请输入元素,求直接前驱");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t7.请输入元素,求直接后继");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t8.在第i个位置插入元素\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t9.删除第i个元素\t\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t10.输出所输入的链表元素\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t11.初始化并输入链表元素\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 15;i++)
printf("*");
printf("\t12.退出\t\t\t");
for(int i = 0;i < 15;i++)
printf("*");
printf("\n");
for(int i = 0;i < 55;i++)
printf("*");
printf("\n");
printf("请输入你的选择:\n");
}
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L)//链表初始化
{
if(!(L == 0))
{
LinkList p,q;
p = L->next;
while(p)
{
q = p-> next;
free(p);
p = q;
}
L->next = NULL;
printf("链表已重置\n");
}
else
{
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
printf("初始化成功!\n");
}
}
void DestoryList(LinkList *L)//链表销毁
{
LinkList q,p = *L;//p指向L链表头结点
if(p == 0)
printf("链表未初始化!\n");
else
{
while(p != 0)
{
q = p -> next;
delete p;
p = q;
}
*L = NULL;//头结点指针清空
L = 0;
printf("链表销毁成功!\n");
}
}
void CountNode(LinkList &L)//计算节点个数
{
if(L == 0)
printf("链表未初始化!\n");
else
{
int n = 0;
LNode *p;
p = L->next;
while(p)
{
p = p->next;
++n;
}
if(n)
printf("节点有 %d 个\n",n);
else
printf("链表为空!\n");
}
}
void CreatList(LinkList &L,int n)//初始化并创建单链表 向链表里插入n个数
{
if(!(L == 0))
{
printf("链表已初始化,无需重复操作!\n");
}
else
{
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
printf("初始化成功!\n");
}
LNode *p,*tail;
tail = L;//尾插法
printf("请输入元素:");
for(int i = 0;i < n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&(p->data));
p->next = tail->next;
tail->next= p;
tail = p;
}
}
void GetElem(LinkList L,int i,int &e)//所指位序的元素值
{
LNode *p;
p = L->next;
int j = 1;
while(p && j < i)
{
p = p->next;
++j;
}
if(!p || j > i)
printf("获取失败!\n");
else
{
e = p->data;
printf("获取的值为:%d\n",e);
}
}
void GetPosition(LinkList L,int i)//所指元素值的位序(第一次出现的地方)
{
LNode *p;
p = L->next;
int j = 0,flag = 0;
while(p)
{
while(p->data != i)
{
p = p->next;
if(p == NULL)
{
flag = 1;
break;
}
j++;
}
break;
}
if(flag == 0)
printf("所指元素值的位序为:%d\n",j);
else
printf("未找到该元素值。\n");
}
void ElemPrimer(LinkList L,int e)//求前驱
{
LinkList p = L->next,q = p->next;
while(q)
{
if(e == q -> data)
{
if(p)
printf("所求前驱为:%d\n",p->data);
else
printf("该节点无前驱\n");
return;
}
else
{
p = q;
}
q = p->next;
}
}
void ElemNext(LinkList L,int e)//求后继
{
int i = 0;
LinkList p = L->next,q = NULL;
while(p)
{
if(e == p->data)
{
q = p->next;
if(p)
printf("所求后继的值为:%d\n",q->data);
else
printf("该节点无后继\n");
return;
}
else
p = p->next;
i++;
}
}
void ElemInsert(LinkList L,int i,int &e)//插入数值
{
LinkList p,s;
p = L->next;
int j = 1;
while(p && j < i)
{
p = p->next;
j++;
}
if(!p || j > i)
{
printf("插入失败!\n");
}
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
printf("插入完成!\n");
}
void LinkListDelete(LinkList &L,int i)//删除指定位置数值
{
int j = 0,e;
LNode *p,*q;
p = L;
while((p->next)&&(j < i-1))
{
p = p->next;
j++;
}
if(!(p->next) || (j > i-1))
printf("删除位置错误!\n");
else
{
q = p->next;
p -> next = q -> next;
e = q -> data;
free(q);
printf("删除成功!\n");
}
}
void TraveList(LinkList L)//遍历输出
{
LNode *p;
p = L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
int n,t,e;
LinkList L;
L = 0;
init();
while(~scanf("%d",&n))
{
if(n == 1)
{
InitList(L);
}
if(n == 2)
{
DestoryList(&L);
}
if(n == 3)
{
CountNode(L);
}
if(n == 4)
{
if(L == 0)
printf("链表未初始化!\n");
else
{
printf("请输入需要获取元素的位置:");
scanf("%d",&t);
GetElem(L,t,e);
}
}
if(n == 5)
{
if(L == 0)
printf("链表未初始化!\n");
else
{
printf("请输入需要查找的元素的值:");
scanf("%d",&t);
GetPosition(L,t);
}
}
if(n == 6)
{
int e;
if(L == 0)
printf("链表未初始化!\n");
else
{
printf("请输入需要求前驱的元素值:");
scanf("%d",&e);
ElemPrimer(L,e);
}
}
if(n == 7)
{
int e;
if(L == 0)
printf("链表未初始化!\n");
else
{
printf("请输入需要求后继的元素值:");
scanf("%d",&e);
ElemNext(L,e);
}
}
if(n == 8)
{
int i,e;
if(L == 0)
printf("链表未初始化!\n");
else
{
printf("请输入需要插入的位置和数字(一行,用空格隔开):");
scanf("%d %d",&i,&e);
ElemInsert(L,i,e);
}
}
if(n == 9)
{
int i;
if(L == 0)
printf("链表未初始化!\n");
else
{
printf("请输入需要删除元素的位序:");
scanf("%d",&i);
LinkListDelete(L,i);
}
}
if(n == 10)
{
if(L == 0)
printf("链表未初始化!\n");
else
{
TraveList(L);
}
}
if(n == 11)
{
printf("请输入需要输入元素的个数:");
scanf("%d",&t);
CreatList(L,t);
printf("输入完成!\n");
}
if(n == 12)
{
printf("程序结束!\n");
break;
}
}
return 0;
}
三.顺序栈的基本操作
(1)实验目的
通过该实验,让学生掌握栈的相关基本概念,认识栈是插入和删除集中在一端进行的线性结构,掌握栈的“先入后出”操作特点。栈在进行各类操作时,栈底指针固定不动,掌握栈空、栈满的判断条件。
(2)实验内容
用顺序存储结构,实现教材定义的栈的基本操作,提供数制转换功能,将输入的十进制整数转换成二进制。
(3)参考界面

(4)验收/测试用例
通过菜单调用各个操作,测试点:
- 没有初始化前进行其他操作,程序是否能控制住;
- 初始化一个栈;
- 判栈空,屏幕显示栈为空;
- 3个数入栈, 1、2、3;
- 栈长度,屏幕输出3;
- 取栈顶元素,再判栈空,然后再判栈长度。让学生知道取栈顶元素不改变栈中的内容,栈顶指针不发生改变;
- 出栈,再判栈长度;
- 销毁栈,再做其他操作,判断程序是否能控制
代码实现
#include <stdio.h>
#include <stdlib.h>
void i1();
void init();
const int Stacksize = 100,addsize = 10;
typedef struct{
int *top;
int *base;
int stacksize;
int length;
}SqStack;
int InitStack(SqStack &S)//1初始化
{
S.base = (int *)malloc(Stacksize * sizeof(int));
if(!S.base)
{
printf("栈初始化失败!\n");
return 0;
}
S.top = S.base;
S.stacksize = Stacksize;
S.length = 0;
printf("栈初始化成功!\n");
}
int DestoryStack(SqStack &S)//2销毁
{
if(S.base)
{
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
printf("销毁成功!\n");
return 1;
}
}
int ClearStack(SqStack &S)//3置空
{
if(S.base)
{
S.top = S.base;
printf("栈置空成功!\n");
}
else
printf("栈已经为空\n");
}
int Empty(SqStack &S)//4 判空
{
if(S.top == S.base)
return 1;
else
return 0;
}
int Length(SqStack S)//5长度
{
if(S.top == S.base)
{
printf("栈为空!\n");
}
else
printf("栈的长度为:%d\n",S.length);
}
int GetTop(SqStack &S)//6取栈顶元素
{
if(S.top == S.base)
{
return 0;
}
else
{
return *(S.top - 1);
}
}
int Push(SqStack &S,int e)//7元素压入栈
{
if(S.top - S.base >= S.stacksize)
{
S.base = (int*)realloc(S.base,(S.stacksize + addsize)*sizeof(int));
if(!S.base)
{
printf("分配空间失败!\n");
return 0;
}
S.top = S.stacksize + S.base;
S.stacksize += addsize;
}
*S.top++ = e;
S.length++;
printf("插入成功!\n");
}
int DeleteStack(SqStack &S)//8删除栈顶元素并返回值
{
if(S.base == S.top)
{
printf("栈为空!\n");
return 0;
}
printf("删除的栈顶元素为:%d\n",*(S.top-1));
free(S.top-1);
S.top--;
S.stacksize--;
printf("删除成功!\n");
}
int Pop(SqStack S)//9弹出栈内元素
{
if(S.base == S.top)
{
printf("栈为空!\n");
return 0;
}
int *p = S.base;
printf("栈内元素值为:\n");
while(p != S.top)
{
printf("%d ",*p);
p++;
}
}
void Initscanf(SqStack &S,int e)//10创建并输出
{
int k;
if(S.base)
printf("栈已进行了初始化!\n");
else
InitStack(S);
printf("请输入%d个入栈元素:",e);
for(int i = 0;i < e;i++)
{
scanf("%d",&k);
Push(S,k);
}
printf("\n");
}
int main()
{
int n,e;
SqStack S;
S.base = 0;
init();
while(scanf("%d",&n)!=EOF)
{
if(!S.base && n != 1 && n != 10 && n != 11)
{
printf("栈未进行初始化!\n");
continue;
}
if(S.base && n == 1)
{
printf("栈已进行了初始化!\n");
continue;
}
if(n == 1)
{
InitStack(S);
}
if(n == 2)
{
DestoryStack(S);
}
if(n == 3)
{
ClearStack(S);
}
if(n == 4)
{
if(Empty(S))
printf("栈为空!\n");
else
printf("栈为非空!\n");
}
if(n == 5)
{
Length(S);
}
if(n == 6)
{
if(!GetTop(S))
printf("栈为空!\n");
else
printf("栈顶元素为:%d\n",GetTop(S));
}
if(n == 7)
{
printf("请输入需要压入栈的元素值:");
scanf("%d",&e);
Push(S,e);
}
if(n == 8)
{
DeleteStack(S);
}
if(n == 9)
{
Pop(S);
printf("\n");
}
if(n == 10)
{
printf("请输入需要入栈的元素个数:");
scanf("%d",&e);
Initscanf(S,e);
}
if(n == 11)
{
printf("程序结束!");
break;
}
}
}
void i1()
{
for(int i = 0;i < 20;i++)
printf("*");
}
void init()
{
for(int i = 0;i < 76;i++)
printf("*");
printf("\n");
i1();
printf(" 1.初始化为空栈\t\t\t");
i1();
printf("\n");
i1();
printf(" 2.销毁栈\t\t\t\t");
i1();
printf("\n");
i1();
printf(" 3.将栈置空\t\t\t\t");
i1();
printf("\n");
i1();
printf(" 4.判断栈是否为空栈\t\t\t");
i1();
printf("\n");
i1();
printf(" 5.返回栈的长度\t\t\t");
i1();
printf("\n");
i1();
printf(" 6.求栈顶元素\t\t\t");
i1();
printf("\n");
i1();
printf(" 7.插入元素,并使其成为栈顶元素\t");
i1();
printf("\n");
i1();
printf(" 8.删除栈顶元素,并返回其值\t\t");
i1();
printf("\n");
i1();
printf(" 9.输出栈内元素\t\t\t");
i1();
printf("\n");
i1();
printf(" 10.创建并输出入栈元素\t\t");
i1();
printf("\n");
i1();
printf(" 11.退出\t\t\t\t");
i1();
printf("\n");
for(int i = 0;i < 76;i++)
printf("*");
printf("\n");
printf("请输入选择:");
}
四.链队列的基本操作
(1)实验目的
通过该实验,使学生理解链队列的构造特点并灵活应用,掌握链队基本操作的编程实现,认识栈是在一端进行插入,在另一端进行删除集中操作的线性结构,掌握队列的“先入先出”操作特点,知道判断队列空和满的条件,进一步熟悉C语言中指针操作。
(2)实验内容
用链式存储结构,实现教材定义的队列的基本操作。
(3)参考界面
(4)验收/测试用例
通过菜单调用各个操作,测试点:
- 没有初始化前进行其他操作,程序是否能控制住;
- 初始化一个队列;
- 判队列空,屏幕显示队列为空;
- 4个数入队, 1、2、3、5;
- 栈长度,屏幕输出4;
- 取队头元素,再判栈空,然后再判栈长度。让学生知道取队头元素不改变队列中的内容,队头指针不发生改变;
- 出队,再判栈长度;
- 销毁队,再做其他操作,判断程序是否能控制
代码实现
#include <stdio.h>
#include <stdlib.h>
void init();
typedef struct QNode{
int data;
QNode *next;
}QNode,*QPtr;
typedef struct{
QPtr front;
QPtr rear;
int length;
}LinkQ;
int e;
int InitQueue(LinkQ &Q)//1初始化
{
if(Q.front)
{
printf("已进行过初始化!\n");
}
else
{
Q.front = Q.rear = new QNode;
Q.front -> next = NULL;
Q.length = 0;
printf("初始化成功!\n");
}
}
int DestoryQ(LinkQ &Q)//2队列销毁
{
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else
{
while(Q.front)
{
Q.rear = Q.front->next;
delete(Q.front);
Q.front = Q.rear;
}
Q.front = 0;
printf("队列销毁成功!\n");
}
}
int ClearQ(LinkQ &Q)//3置空
{
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else
{
if(Q.front == Q.rear)
printf("队列已经为空!\n");
else{
Q.front = Q.rear;
Q.length = 0;
printf("队列置空成功!\n");
}
}
}
int EmptyQ(LinkQ &Q)//4判空
{
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else
{
if(Q.front == Q.rear)
{
printf("队列为空!\n");
}
else
printf("队列为非空!\n");
}
}
int LengthQ(LinkQ &Q)//5元素个数
{
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else{
printf("队列内元素的个数是:%d\n",Q.length);
}
}
int GetTop(LinkQ Q)//6队头元素
{
QNode *p;
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else{
if(Q.front == Q.rear)
{
printf("队列为空!\n");
}
else
{
p = Q.front->next;
printf("队头元素为:%d\n",p->data);
}
}
}
int EnQ(LinkQ &Q)//7插入队头元素
{
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else
{
printf("请输入需要插入的元素值:");
scanf("%d",&e);
QNode *p = new QNode;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
Q.length++;
printf("插入成功!\n");
}
}
int DeleteQ(LinkQ &Q)//8删除队头元素
{
QNode *p;
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else
{
if(Q.front == Q.rear)
{
printf("队列为空!\n");
}
else
{
p = Q.front->next;
Q.front->next = p->next;//如果是最后一个 则为NULL
if(Q.rear == p)
Q.rear = Q.front;
free(p);
printf("删除成功!\n");
}
}
}
int InitCreateQ(LinkQ &Q)//9初始化并创建
{
int k;
InitQueue(Q);
printf("请输入入队元素的个数:");
scanf("%d",&e);
printf("请输入%d个入队元素\n");
for(int i = 0;i <e;i++)
{
scanf("%d",&k);
QNode *p = new QNode;
p->data = k;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
Q.length++;
printf("插入成功!\n");
}
}
int PrintQ(LinkQ Q)//10输出队列元素
{
QNode *p;
if(!Q.front)
{
printf("队列未进行初始化!\n");
}
else
{
if(Q.front == Q.rear)
{
printf("队列为空!\n");
}
else
{
p = Q.front->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
}
}
int main()
{
int n;
init();
LinkQ Q;
Q.front = 0;
while(~scanf("%d",&n))
{
if(n == 1)
{
InitQueue(Q);
}
if(n == 2)
{
DestoryQ(Q);
}
if(n == 3)
{
ClearQ(Q);
}
if(n == 4)
{
EmptyQ(Q);
}
if(n == 5)
{
LengthQ(Q);
}
if(n == 6)
{
GetTop(Q);
}
if(n == 7)
{
EnQ(Q);
}
if(n == 8)
{
DeleteQ(Q);
}
if(n == 9)
{
InitCreateQ(Q);
}
if(n == 10)
{
PrintQ(Q);
}
if(n == 11)
{
break;
}
}
return 0;
}
void i1()
{
for(int i = 0;i < 20;i++)
printf("*");
}
void init()
{
for(int i = 0;i < 76;i++)
printf("*");
printf("\n");
i1();
printf(" 1.初始化队列\t\t\t");
i1();
printf("\n");
i1();
printf(" 2.销毁队列\t\t\t\t");
i1();
printf("\n");
i1();
printf(" 3.清空队列\t\t\t\t");
i1();
printf("\n");
i1();
printf(" 4.判断队列是否为空\t\t\t");
i1();
printf("\n");
i1();
printf(" 5.返回队列中元素个数\t\t");
i1();
printf("\n");
i1();
printf(" 6.返回队列队头元素\t\t\t");
i1();
printf("\n");
i1();
printf(" 7.插入新的队尾元素\t\t\t");
i1();
printf("\n");
i1();
printf(" 8.删除队头元素\t\t\t");
i1();
printf("\n");
i1();
printf(" 9.初始化并创建队列\t\t\t");
i1();
printf("\n");
i1();
printf(" 10.输出队列元素\t\t\t");
i1();
printf("\n");
i1();
printf(" 11.退出\t\t\t\t");
i1();
printf("\n");
for(int i = 0;i < 76;i++)
printf("*");
printf("\n");
printf("请输入选择:");
}

2151

被折叠的 条评论
为什么被折叠?



