p=p->next;j++; }
if(!p||j>i)
return ERROR;
*e=p->data; return OK; }/*GetElem*/
int main(){
int n,i;ElemType e;
LinkList L=NULL; /*定义指向单链表的指针*/ printf(\输入单链表的元素个数*/ scanf(\ if(n>0){
printf(\ L=CreateList(n);
printf(\ PrintList(L);
printf(\ printf(\ scanf(\
if(GetElem(L,i,&e))
printf(\ else
printf(\ }else
printf(\ return 0; }
?
运行结果
?
算法分析
4、为第3题补充插入功能函数和删除功能函数。并在主函数中补充代码验证算法的正确性。 插入算法代码:
11
?
运行结果
?
算法分析
删除算法代码: ? 运行结果 ? 算法分析
12
以下为选做实验:
5、循环链表的应用(约瑟夫回环问题)
n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:用一个无头结点的循环单链表来实现n个元素的存储。 ? 算法代码
6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。
提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。 ? 算法代码
四、实验小结
五、教师评语
13
实验二 栈和队列
一、实验目的
1、掌握栈的结构特性及其入栈,出栈操作;
2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。
二、实验预习
说明以下概念 1、顺序栈:
2、链栈:
3、循环队列:
4、链队
三、实验内容和要求
1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。
#include
#define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int ElemType; /*定义元素的类型*/ typedef struct{ ElemType *base; ElemType *top;
int stacksize; /*当前已分配的存储空间*/
14
}SqStack;
int InitStack(SqStack *S); /*构造空栈*/ int push(SqStack *S,ElemType e); /*入栈*/ int Pop(SqStack *S,ElemType *e); /*出栈*/ int CreateStack(SqStack *S); /*创建栈*/
void PrintStack(SqStack *S); /*出栈并输出栈中元素*/
int InitStack(SqStack *S){
S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base;
S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/
int Push(SqStack *S,ElemType e){
}/*Push*/
int Pop(SqStack *S,ElemType *e){
}/*Pop*/
int CreateStack(SqStack *S){ int e;
if(InitStack(S))
printf(\ else{
printf(\ return ERROR; }
printf(\ while(scanf(\ Push(S,e); return OK; }/*CreateStack*/
15