了解实现线性表/栈与队/数组所涉及到的数据结构。
二、实验要求
因受时间限制,从以下给出的4个实验内容中任选3个,分析并补齐给出的源程序,运行相应的程序,检验运行结果,以此巩固对相应部分的理论知识的理解。

1.复习线性表、栈与队列的定义,理解顺序存储、链式存储的方法及基本操作。
2.复习C语言中数组、指针及结构体的概念、定义方式。
3.上机前准备好全部源程序。
4.计算机中需要安装vc6.0或vs2010。
5.程序中所用结构体定义于datastru.h中。
三、实验内容
熟悉vs2010环境下建立程序源文件与调试程序的流程。
1、完成有序表(顺序表)中插入一元素并保证仍然有序。
……(补充程序)
void main( )
{
SEQUENLIST L;
int num,i,k,x;
L.last=0; //置顺序表为空,表长为0
printf("请输入顺序表元素,元素为整型量,用空格分开,-99为结束标志:");
/输入顺序表元素,建立有序表,值从小到大/
scanf("%d",&num);
while (num !=-99) {
………(补充程序)
L.last++;
scanf("%d",&num);
}
printf("%d",L.last);
printf("输入要插入的元素值(整型) : ");
scanf("%d",&num);
printf("\n插入前有序表元素列表 :");
for (i=0; i<L.last; i++)
printf("%4d",L.datas[i]);
printf("\n");
k = L.last-1;
while ((k>= 0) && (num<L.datas[k])) /查找插入位置i /
k--;
for(i=L.last-1; i>=k+1; i--)
L.datas[i+1]=L.datas[i]; /移动元素 /
L.datas[k+1]=num; /新元素插入/
L.last++; /表长加1 /
printf("\n插入后有序表元素列表 :");
for (i=0; i<L.last; i++)
printf("%4d",L.datas[i]);
printf("\n");
}
2、完成链表的结点插入、删除操作,并显示操作前后的线性表中各元素的情况。
……(补充程序)
void inser_order(DATATYPE2 x, LINKLIST head){
LINKLIST pr, pn, pp;
pr = head; pn = head->next;
while(pn != NULL && pn->data < x)
{
……(补充程序)
}
pp = (LINKLIST )malloc(sizeof(LINKLIST));
……(补充程序)
}
int count_head(LINKLIST head) /输出单链表元素值并计数/
{
int i = 0;
LINKLIST p;
p = head->next;
printf("输出单链表元素值 : ");
while(p != NULL)
{
……(补充程序)
}
printf("\n");
return i;
}
LINKLIST creatlink_order_head(LINKLIST head) /建立带头结点的有序单链表/
{
LINKLIST t, p, q;
char ch;
t = (LINKLIST )malloc(sizeof(LINKLIST)); //建立带头结点的空链表
t->next = NULL;
head = t;
printf("单链表元素值为单个字符, 连续输入,#为结束字符 : ");
while ((ch = getchar()) != '#')
{
……(补充程序)
}
return head;
}
int main()
{
LINKLIST head = NULL;
int num;
char ch;
printf("\n 建立单链表\n\n");
head = creatlink_order_head(head);
num = count_head(head);
printf("单链表元素个数 = %d\n", num);
fflush(stdin);
printf("\n输入插入元素值 : ");
ch = getchar();
inser_order(ch, head);
printf("\n 元素插入后\n\n");
num = count_head(head);
printf("插入后单链表元素个数 = %d\n", num);
return 1;
}
3、运用栈完成十进制数与八进制数的转换。
……(补充程序)
void initstack(SEQSTACK s) /顺序栈初始化/
{
……(补充程序)
}
DATATYPE1 gettop(SEQSTACK s) /返回栈顶元素/
{
DATATYPE1 x;
……(补充程序)
return x;
}
int push(SEQSTACK s, DATATYPE1 x) /元素x入栈/
{
if(s->top == MAXSIZE-1)
{
……(补充程序)
}
else
{
……(补充程序)
return 1;
}
}
DATATYPE1 pop(SEQSTACK s) /返回栈顶元素并删除栈顶元素/
{
DATATYPE1 x;
if(s->top == 0)
{
printf("栈空\n");
x=0;
}
else
{
……(补充程序)
}
return x;
}
int main( )
{
SEQSTACK stack, s;
int n;
s = &stack;
initstack(s);
n = 0;
printf("输入一非负整数(十进制) :");
scanf("%d",&n);
push(s,'#');
while(n != 0)
{
push(s, n % 8); / %为求余数运算符, 余数入栈/
n = n / 8; / /为求整数商运算符,商不为零,继续运行/
}
printf("\n\n对应的八进制数为 :");
while(gettop(s) != '#')
printf("%d",pop(s));
printf("\n");
return 1;
}
4、实现带头结点链队元素的删除、插入操作,并显示操作前后的队列情况。
……(补充程序)
DATATYPE1 dellinkqueue(LINKQUEUE q) /删除队头元素并返回/
{
……(补充程序)
if(q->front == q->rear)
{
printf("队列空\n");
v = 0;
}
else
{
……(补充程序)
}
return v;
}
void enlinkqueue(LINKQUEUE q, DATATYPE1 x) /元素x 入队列/
{
(q->rear)->next = (LINKQLIST )malloc(sizeof(LINKQLIST));
……(补充程序)
}
void initlinkqueue(LINKQUEUE q) /链队列初始化/
{
……(补充程序)
}
void outlinkqueue(LINKQUEUE q) /链队列元素依次显示/
{
LINKQLIST p;
p = q->front;
printf("队列元素显示 : ");
while(p != q->rear)
{
……(补充程序)
}
printf("\n");
}
int main()
{
LINKQUEUE lq, p;
int j;
p = &lq;
initlinkqueue(p);
printf("输入一整数(奇数——入队列、偶数——删除队头元素、0——退出) : ");
scanf("%d", &j);
while(j != 0) /输入 0——退出/
{
if(j % 2 == 1)
enlinkqueue(p,j); /输入奇数——入队列/
else
j = dellinkqueue(p); /输入偶数——删除队头元素/
outlinkqueue(p);
printf("\n输入一整数(奇数——入队列、偶数——删除队头元素、0——退出) : ");
scanf("%d", &j); /继续输入/
}
return 1;
}
四、注意事项
注意程序中用到的结构体的来源及表示方法、调用方式。读懂程序结构,先补齐缺失代码,再调试运行程序。
五、实验总结和体会