数据与结构的第三次实验报告

时间:2024.4.20

第三次实验报告   庄振涛

实验题3-1实现循环单链表的各种基本运算,完成以下功能:

(1)       初始化循环单链表H。

(2)       采用尾插法插入a,b,c,d,e。

(3)       输出循环单链表H。

(4)       输出循环单链表H的长度。

(5)       在第3个位置上插入f。

(6)       输出循环单链表H。

(7)       删除第2个数据。

(8)       输出循环单链表H。

程序:

#include <stdio.h>

#include <malloc.h>

typedef char ElemType;

typedef struct LNode     /*定义单链表结点类型*/

{

    ElemType data;

    struct LNode *next;

} LinkList;

void InitList(LinkList *&L)

{

    L=(LinkList *)malloc(sizeof(LinkList));   /*创建头结点*/

    L->next=L;

}

void DestroyList(LinkList *&L)

{

    LinkList *p=L,*q=p->next;

    while (q!=L)

    {

       free(p);

       p=q;

       q=p->next;

    }

    free(p);

}

int ListEmpty(LinkList *L)

{

    return(L->next==L);

}

int ListLength(LinkList *L)

{

    LinkList *p=L;int i=0;

    while (p->next!=L)

    {

       i++;

       p=p->next;

    }

    return(i);

}

void DispList(LinkList *L)

{

    LinkList *p=L->next;

    while (p!=L)

    {

       printf("%c",p->data);

       p=p->next;

    }

    printf("\n");

}

int GetElem(LinkList *L,int i,ElemType &e)

{

    int j=0;

    LinkList *p;

    if (L->next!=L)      /*单链表不为空表时*/

    {

       if (i==1)

       {

           e=L->next->data;

           return 1;

       }

       else          /*i不为1时*/

       {

           p=L->next;

           while (j<i-1 && p!=L)

           {

              j++;

              p=p->next;

           }

           if (p==L)

              return 0;

           else

           {

              e=p->data;

              return 1;

           }

       }

    }

    else              /*单链表为空表时*/

       return 0;

}

int LocateElem(LinkList *L,ElemType e)

{

    LinkList *p=L->next;

    int n=1;

    while (p!=L && p->data!=e)

    {

       p=p->next;

       n++;

    }

    if (p==L)

       return(0);

    else

       return(n);

}

int ListInsert(LinkList *&L,int i,ElemType e)

{

    int j=0;

    LinkList *p=L,*s;

    if (p->next==L || i==1)     /*原单链表为空表或i==1时*/

    {

       s=(LinkList *)malloc(sizeof(LinkList));   /*创建新结点*s*/

       s->data=e;                        

       s->next=p->next;     /*将*s插入到*p之后*/

       p->next=s;

       return 1;

    }

    else

    {

       p=L->next;

       while (j<i-2 && p!=L)

       {

           j++;

           p=p->next;

       }

       if (p==L)            /*未找到第i-1个结点*/

           return 0;

       else                 /*找到第i-1个结点*p*/

       {

           s=(LinkList *)malloc(sizeof(LinkList));   /*创建新结点*s*/

           s->data=e;                        

           s->next=p->next;                   /*将*s插入到*p之后*/

           p->next=s;

           return 1;

       }

    }

}

int ListDelete(LinkList *&L,int i,ElemType &e)

{

    int j=0;

    LinkList *p=L,*q;

    if (p->next!=L)                 /*原单链表不为空表时*/

    {

       if (i==1)                /*i==1时*/

       {

           q=L->next;           /*删除第1个结点*/

           L->next=q->next;

           free(q);

           return 1;

       }

       else                     /*i不为1时*/

       {

           p=L->next;

           while (j<i-2 && p!=L)

           {

              j++;

              p=p->next;

           }

           if (p==L)            /*未找到第i-1个结点*/

              return 0;

           else                 /*找到第i-1个结点*p*/

           {

              q=p->next;        /*q指向要删除的结点*/

              p->next=q->next;  /*从单链表中删除*q结点*/

              free(q);          /*释放*q结点*/

              return 1;

           }

       }

    }

    else return 0;

    extern void InitList(LinkList *&L);       /*以下均为外部函数*/

    extern void DestroyList(LinkList *&L);

    extern int ListEmpty(LinkList *L);

    extern int ListLength(LinkList *L);

    extern void DispList(LinkList *L);

    extern int GetElem(LinkList *L,int i,ElemType &e);

    extern int LocateElem(LinkList *L,ElemType e);

    extern int ListInsert(LinkList *&L,int i,ElemType e);

    extern int ListDelete(LinkList *&L,int i,ElemType &e);

    }

void main()

{

    LinkList *h;

    ElemType e;

    printf("(1)初始化循环单链表h\n");

    InitList(h);

    printf("(2)依次采用尾插法插入a,b,c,d,e元素\n");

    ListInsert(h,1,'a');

    ListInsert(h,2,'b');

    ListInsert(h,3,'c');

    ListInsert(h,4,'d');

    ListInsert(h,5,'e');

    printf("(3)输出循环单链表h:");

    DispList(h);

    printf("(4)循环单链表h长度=%d\n",ListLength(h));

    printf("(5)在第3个元素位置上插入f元素\n");

    ListInsert(h,3,'f');

    printf("(6)输出循环单链表h:");

    DispList(h);

    printf("(7)删除h的第2个元素\n");

       ListDelete(h,2,e);

    printf("(8)输出循环单链表h:");

    DispList(h);

}}结果:

实验题3-2  实现顺序栈的各种基本运算,完成以下功能:

(1)       初始化顺序栈S。

(2)       判断栈S是否非空。

(3)       依次进栈元素a,b,c,d,e,f。

(4)       输出顺序栈长度。

(5)       输出从栈顶到栈底的元素。

(6)       出栈两次。

(7)       输出从栈顶到栈底的元素。

(8)        

程序:

#include <stdio.h>

#include <malloc.h>

#define MaxSize 100

typedef char ElemType;

typedef struct

{

    ElemType elem[MaxSize];

    int top;      /*栈指针*/

} SqStack;

void InitStack(SqStack *&s)

{

    s=(SqStack *)malloc(sizeof(SqStack));

    s->top=-1;

}

void ClearStack(SqStack *&s)

{

    free(s);

}

int StackLength(SqStack *s)

{

    return(s->top+1);

}

int StackEmpty(SqStack *s)

{

    return(s->top==-1);

}

int Push(SqStack *&s,ElemType e)

{

    if (s->top==MaxSize-1)

       return 0;

    s->top++;

    s->elem[s->top]=e;

    return 1;

}

int Pop(SqStack *&s,ElemType &e)

{

    if (s->top==-1)

       return 0;

    e=s->elem[s->top];

    s->top--;

    return 1;

}

int GetTop(SqStack *s,ElemType &e)

{

    if (s->top==-1)

       return 0;

    e=s->elem[s->top];

    return 1;

}

void DispStack(SqStack *s)

{

    int i;

    for (i=s->top;i>=0;i--)

       printf("%c ",s->elem[i]);

    printf("\n");

extern void InitStack(SqStack *&s);

extern void ClearStack(SqStack *&s);

extern int StackLength(SqStack *s);

extern int StackEmpty(SqStack *s);

extern int Push(SqStack *&s,ElemType e);

extern int Pop(SqStack *&s,ElemType &e);

extern int GetTop(SqStack *s,ElemType &e);

extern void DispStack(SqStack *s);

}

void main()

{

    ElemType e;

    SqStack *s;

    printf("(1)初始化栈s\n");

    InitStack(s);

    printf("(2)栈为%s\n",(StackEmpty(s)?"空":"非空"));

    printf("(3)依次进栈元素a,b,c,d,e\n");

    Push(s,'a');

    Push(s,'b');

    Push(s,'c');

    Push(s,'d');

    Push(s,'e');

    printf("(4)栈长度:%d\n",StackLength(s));

    printf("(5)从栈顶到栈底元素:");DispStack(s);

    printf("(6)出栈序列:");

    Pop(s,e);

    printf("%c ",e);

    Pop(s,e);

    printf("%c ",e);

    printf("\n");

    printf("(7)从栈顶到栈底元素:");DispStack(s);

   

}

结果:

实验题3-3 实现单链栈的各种基本运算,完成以下功能:

(1)       初始化链栈S。

(2)       判断栈S是否非空。

(3)       依次进栈元素a,b,c,d,e。

(4)       输出链栈长度。

(5)       输出从栈顶到栈底的元素。

(6)       删除栈顶元素。

(7)       输出从栈顶到栈底的元素。

程序:/*文件名:algo3-3.cpp*/

#include <stdio.h>

#include <malloc.h>

typedef char ElemType;

typedef struct linknode

{

    ElemType data;              /*数据域*/

    struct linknode *next;      /*指针域*/

} LiStack;

void InitStack(LiStack *&s)

{

    s=(LiStack *)malloc(sizeof(LiStack));

    s->next=NULL;

}

void ClearStack(LiStack *&s)

{

    LiStack *p=s->next;

    while (p!=NULL)

    {

       free(s);

       s=p;

       p=p->next;

    }

}

int StackLength(LiStack *s)

{

    int i=0;

    LiStack *p;

    p=s->next;

    while (p!=NULL)

    {

       i++;

       p=p->next;

    }

    return(i);

}

int StackEmpty(LiStack *s)

{

    return(s->next==NULL);

}

void Push(LiStack *&s,ElemType e)

{

    LiStack *p;

    p=(LiStack *)malloc(sizeof(LiStack));

    p->data=e;

    p->next=s->next;     /*插入*p结点作为第一个数据结点*/

    s->next=p;

}

int Pop(LiStack *&s,ElemType &e)

{

    LiStack *p;

    if (s->next==NULL)       /*栈空的情况*/

       return 0;

    p=s->next;           /*p指向第一个数据结点*/

    e=p->data;

    s->next=p->next;

    free(p);

    return 1;

}

int GetTop(LiStack *s,ElemType &e)

{

    if (s->next==NULL)       /*栈空的情况*/

       return 0;

    e=s->next->data;

    return 1;

}

void DispStack(LiStack *s)

{

    LiStack *p=s->next;

    while (p!=NULL)

    {

       printf("%c ",p->data);

       p=p->next;

    }

    printf("\n");

extern void InitStack(LiStack *&s);

extern void ClearStack(LiStack *&s);

extern int StackLength(LiStack *s);

extern int StackEmpty(LiStack *s);

extern void Push(LiStack *&s,ElemType e);

extern int Pop(LiStack *&s,ElemType &e);

extern int GetTop(LiStack *s,ElemType &e);

extern void DispStack(LiStack *s);

}

void main()

{

    ElemType e;

    LiStack *s;

    printf("(1)初始化链栈s\n");

    InitStack(s);

    printf("(2)链栈为%s\n",(StackEmpty(s)?"空":"非空"));

    printf("(3)依次进链栈元素a,b,c,d,e\n");

    Push(s,'a');

    Push(s,'b');

    Push(s,'c');

    Push(s,'d');

    Push(s,'e');

    printf("(4)链栈长度:%d\n",StackLength(s));

    printf("(5)从链栈顶到链栈底元素:");DispStack(s);

    printf("(6)删除栈顶元素:"); Pop(s,e);

    printf("%c ",e);printf("\n");

    printf("(7)从链栈顶到链栈底元素:");DispStack(s);

}

结果:

更多相关推荐:
数据结构实验报告

实验报告实验课程:数据结构实验项目:实验专业:计算机科学与技术姓名:**学号:***指导教师:**实验时间:20**-12-7重庆工学院计算机学院数据结构实验报告实验一线性表1.实验要求掌握数据结构中线性表的基…

数据结构实验报告(C语言)(强力推荐)

数据结构实验实验内容和目的掌握几种基本的数据结构集合线性结构树形结构等在求解实际问题中的应用以及培养书写规范文档的技巧学习基本的查找和排序技术让我们在实际上机中具有编制相当规模的程序的能力养成一种良好的程序设计...

数据结构实验———图实验报告

数据结构实验报告目的要求掌握图的存储思想及其存储实现掌握图的深度广度优先遍历算法思想及其程序实现掌握图的常见应用算法的思想及其程序实现实验内容键盘输入数据建立一个有向图的邻接表输出该邻接表3在有向图的邻接表的基...

数据结构实验报告格式

数据结构实验报告格式实验11顺序表的基本操作一实验目的1掌握使用VC上机调试线性表的基本方法2掌握线性表的基本操作插入删除查找等运算在顺序存储结构上的实现二实验内容顺序表的基本操作的实现三实验要求1认真阅读和理...

数据结构实验报告全集

数据结构实验报告全集实验一线性表基本操作和简单程序1实验目的1掌握使用VisualC60上机调试程序的基本方法2掌握线性表的基本操作初始化插入删除取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法2实...

数据结构实验报告5

计算机科学与工程系计算机科学与工程系2计算机科学与工程系附录可包括源程序清单或其它说明includeltiostreamgtincludeltstdiohgtusingnamespacestdtypedefst...

数据结构实验报告[4]

云南大学数据结构实验报告第四次实验学号姓名一实验目的复习线性表的逻辑结构存储结构及基本操作掌握顺序表和带头结点单链表了解有序表二实验内容必做题假设有序表中数据元素类型是整型请采用顺序表或带头结点单链表实现Ord...

数据结构树的实验报告

数据结构实验报告目的要求1掌握二叉树的存储实现2掌握二叉树的遍历思想3掌握二叉树的常见算法的程序实现实验内容1输入字符序列建立二叉链表2中序遍历二叉树递归算法3中序遍历二叉树非递归算法最好也能实现先序后序非递归...

数据结构实验报告

武汉大学国际软件学院实验报告课程名称专业年级姓名学号协作者实验学期课堂时数填写时间月6小结对本次实验的心得体会所遇到的问题及解决方法其他思考和建议7指导教师评语及成绩指导教师依据学生的实际报告内容用简练语言给出...

数据结构第一次上机实验报告

数据结构第一次上机实验报告线性表实验要求1实现顺序表结构的创建插入删除查找等操作2利用上述顺序表操作实现如下程序建立两个顺序表表示的集合集合中无重复的元素并求这样的两个集合的并交和源程序C实现visualstu...

数据结构实验报告(重邮)5个

学号数据结构实验报告学院班级姓名实验一线性链表的实现与操作题目设计一个100位以内的长整数加减运算的程序班级姓名学号完成日期一需求分析1本实验中100位长整数的每位上的数字必须为数字09之间长整数的位数并要求1...

安徽工业大学数据结构实验报告

安徽工业大学计算机学院数据结构实验报告姓名学号班级教师内容线性表基本操作的实现栈的基本操作串的模式匹配二叉树操作图的创建与遍历20xx525实验一线性表基本操作的实现一实验目的1掌握使用TurboC20上机调试...

数据结构实验报告(46篇)