顺序表的基本操作 (2)
数据结构线性表的基本操作及应用实验报告

实验日期2010.4.19 教师签字成绩实验报告【实验名称】第二章线性表的基本操作及应用【实验目的】(1)熟练掌握线性表的基本操作的实现;(2)以线性表的各种操作(建立、插入、删除等)的实现为重点;(3)通过本次实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。
【实验内容】1.顺序表的基本操作(顺序表的插入、访问、删除操作)#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1typedef int ElemType;typedef int Status;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{ElemType *elem;int length;int listsize;}SqList;Status InitList_Sq(SqList *L){int i,n;L->elem = (ElemType * )malloc(LIST_INIT_SIZE*sizeof(ElemType));if (! L->elem) exit (OVERFLOW);printf("您希望您的顺序表有几个元素: ");scanf("%d",&n);printf("\n");printf("输入您的%d个元素,以构建顺序表: \n",n);for(i=1;i<=n;i++)scanf("%d",&L->elem[i-1]);L->length = n;L->listsize = LIST_INIT_SIZE;return OK;}//InitList_SqStatus PrintList_Sq(SqList L){int i;printf("顺序表中的元素为:");for (i=1;i<=L.length;i++)printf("%d ",L.elem[i-1]);printf("\n");return OK;}//PrintList_Sqint ListInsert_Sq(SqList* L,int i,ElemType x) //对顺序表进行插入操作{int j;if (L->length==L->listsize){printf("\t\t\t顺序表已满");return 0;}else{if (i<1||i>L->length){printf("\t\t\t位置不合法");return 0;}else{for(j=L->length-1;j>=i-1;--j)L->elem[j+1]=L->elem[j];L->elem[i-1]=x;L->length++;return 1;}}}int ListDelete_Sq(SqList* L,int i) //对顺序表进行删除操作{int j;if (i<1||i>L->length){printf("\t\t\t不存在第i个元素");return 0;}else{for (j=i-1;j<L->length;j++){L->elem[j]=L->elem[j+1];}L->length--;return 1;}}int LocateElem(SqList *L, int i) {if(i<1||i>L->length)return ERROR;else return L->elem[i-1];}int scan(){int choose;printf("选择要执行的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");printf("输入其他值退出程序……\n");scanf("%d",&choose);return(choose);}void main(){SqList L;ElemType e;int i;int quit=0;if (InitList_Sq(&L)==OVERFLOW)printf("分配失败,退出程序!");printf("输出程序中的元素\n");PrintList_Sq(L);while(!quit)switch(scan()){case 1:printf("\n请输入你所需要插入的位置和你要插入的元素:");printf("\n请输入i和e的值:");scanf("%d%d",&i,&e);if (ListInsert_Sq(&L,i,e)==OK) PrintList_Sq(L);break;case 2:printf("\n请输入你所需要删除元素的位置:");scanf("%d",&i);if(ListDelete_Sq(&L,i)==OK) PrintList_Sq(L);break;case 3:printf("请输入所要查找元素的位置:\n");scanf("%d",&i);if(LocateElem(&L,i))printf("该位置元素的值为:%d!\n",LocateElem(&L,i));else printf("该位置的元素不存在!\n");break;default:quit=1;printf("操作结束!");printf("\n");}}2.单向链表的基本操作(单向链表的插入、删除、查找以及并表操作)#include<stdio.h>#include<malloc.h>typedef int ElemType;#define OK 1#define ERROR 0#define flag 0typedef struct LNode{ElemType data;struct LNode *next;} LNode,*LinkList;LinkList InitLinkList(){LinkList L;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;return L;}LinkList LocateLinkList(LinkList L,int i){LinkList p;int j;p=L->next;j=1;while(p!=NULL&&j<i){p=p->next; j++;}if (j==i)return p;else return NULL;}void LinkListInsert(LinkList L, int i, ElemType e)//插入元素{LinkList p,s;int j;j=1;p=L;while(p&&j<i){p=p->next;j++;}if(p==NULL||j>i)printf("插入位置不正确\n");else {s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;printf("%d已插入到链表中\n",e);}}void LinkListDelete(LinkList L,int i) //删除元素{LinkList p,q;int j;j=1;p=L;while(p->next&&j<i){p=p->next;j++;}if(p->next==NULL)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;free(q);printf("第%d个元素已从链表中删除\n",i);}}LinkList CreatLinkList( )//建立单向链表{LinkList L=InitLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);while (e!=flag){p=(LinkList)malloc(sizeof(LNode));p->data=e;r->next=p;r=p;scanf("%d",&e);}r->next=NULL;return L;}int LinkListLength(LinkList L){LinkList p;int j;p=L->next;j=0;while(p!=NULL){j++;p=p->next;}return j;}void LinkListPrint(LinkList L){LinkList p;p=L->next;if(p==NULL) printf("单链表为空表\n");else{printf("链表中的元素为:\n");while(p!=NULL){printf("%d ",p->data);p=p->next;}}printf("\n");}void Mergelist_L(LinkList La,LinkList Lb,LinkList Lc) {LNode *pa,*pb,*pc,*p;pa=La->next;pb=Lb->next;Lc=La;pc=Lc;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else {pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;p=Lc->next;printf("合并结果:");while(p) {printf("%4d",p->data);p=p->next;}free(Lb);}int scan(){int d;printf("请选择你所要执行的单向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素;4.两个单向链表的合并.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){ LinkList La,Lb,Lc;int quit=0;int i,locate;ElemType e;LinkList L,p;L=CreatLinkList();while(!quit)switch(scan()){case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);LinkListInsert(L,i,e);LinkListPrint(L);break;case 2:if(LinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);LinkListDelete(L,i);}LinkListPrint(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;case 4:La=CreatLinkList();Lb=CreatLinkList();Mergelist_L( La, Lb, Lc);printf("\n");break;default:quit=1;printf("操作结束!");printf("\n");}}3.单向循环链表的基本操作(单向链表的插入、删除、查找操作)#include<stdio.h>#include<malloc.h>typedef int ElemType;#define OK 1#define ERROR 0#define flag 0typedef struct LNode{ElemType data;struct LNode *next;} LNode,*LinkList;LinkList InitLinkList(){LinkList L;L=(LinkList)malloc(sizeof(LNode));L->next=L;return L;}LinkList LocateLinkList(LinkList L,int i){LinkList p;int j;p=L->next;j=1;while(p!=L&&j<i){p=p->next; j++;}if (j==i)return p;else return NULL;}void LinkListInsert(LinkList L, int i, ElemType e)//插入元素{LinkList p,s;int j;j=1;p=L;while(p->next!=L&&j<i){p=p->next;j++;}if(p==L||j>i)printf("插入位置不正确\n");else {s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;printf("%d已插入到链表中\n",e);}}void LinkListDelete(LinkList L,int i) //删除元素{LinkList p,q;int j;j=1;p=L;while(p->next!=L&&j<i){p=p->next;j++;}if(p->next==L)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;free(q);printf("第%d个元素已从链表中删除\n",i);}}LinkList CreatLinkList( )//建立单向链表{LinkList L=InitLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);while (e!=flag){p=(LinkList)malloc(sizeof(LNode));p->data=e;r->next=p;r=p;scanf("%d",&e);}r->next=L;return L;}int LinkListLength(LinkList L){LinkList p;int j;p=L->next;j=0;while(p!=L){j++;p=p->next;}return j;}void LinkListPrint(LinkList L){LinkList p;p=L->next;printf("链表中的元素为:\n");while(p!=L){printf("%d ",p->data);p=p->next;}printf("\n");}int scan(){int d;printf("请选择你所要执行的单向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){int quit=0;int i;ElemType e;LinkList L,p;L=CreatLinkList();while(!quit)switch(scan()){case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);LinkListInsert(L,i,e);LinkListPrint(L);break;case 2:if(LinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);LinkListDelete(L,i);}LinkListPrint(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;default:quit=1;printf("操作结束!");printf("\n");}}4.双向链表的基本操作(双向链表的插入、删除、查找以及并表操作)#include<stdio.h>#include<malloc.h>#define flag 0typedef int status;typedef int ElemType;typedef struct DuLNode{ElemType data;struct DuLNode *prior;struct DuLNode *next;}DuLNode,*DuLinkList;DuLinkList InitDuLinkList(){DuLinkList L;L=(DuLinkList)malloc(sizeof(DuLNode));L->next=L->prior=NULL;return L;}DuLinkList CreatDuLinkList(){DuLinkList L=InitDuLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n");scanf("%d",&e);while (e!=flag){p=(DuLinkList)malloc(sizeof(DuLNode));p->data=e;r->next=p;p->prior=r->next;r=p;scanf("%d",&e);}r->next=NULL;return L;}void ListInsert_DuL(DuLinkList L, int i, ElemType e){ DuLinkList p,s;int j;j=1;p=L;while(p&&j<i){p=p->next;j++;}if(p==NULL||j>i)printf("插入位置不正确\n");else {s=(DuLinkList)malloc(sizeof(DuLNode));s->data=e;s->next=p->next; p->next->prior=s;s->prior=p; p->next=s;printf("%d已插入到双向链表中\n",e); }}void ListDelete_DuL(DuLinkList L,int i) //删除元素{DuLinkList p,q;int j;j=1;p=L;while(p->next&&j<i){p=p->next;j++;}if(p->next==NULL)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;q->next->prior=p;free(q);printf("第%d个元素已从链表中删除\n",i); }}void LinkListPrint_DuL(DuLinkList L){DuLinkList p;p=L->next;if(p==NULL) printf("双链表为空表\n");else{printf("链表中的元素为:\n");while(p!=NULL){printf("%d ",p->data);p=p->next;}}printf("\n");}int DuLinkListLength(DuLinkList L){DuLinkList p;int j;p=L->next;j=0;while(p!=NULL){j++;p=p->next;}return j;}DuLinkList LocateDuLinkList(DuLinkList L,int i) {DuLinkList p;int j;p=L->next;j=1;while(p!=NULL&&j<i)p=p->next; j++;}if (j==i)return p;else return NULL;}void Mergelist_L(DuLinkList La,DuLinkList Lb,DuLinkList Lc){DuLNode *pa,*pb,*pc,*p;pa=La->next;pb=Lb->next;Lc=La;pc=Lc;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else {pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;p=Lc->next;printf("合并结果:");while(p) {printf("%4d",p->data);p=p->next;}free(Lb);}int scan(){int d;printf("请选择你所要执行的双向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素;4.两个双向链表的合并.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){int quit=0;int i;ElemType e;DuLinkList L,p;DuLinkList La,Lb,Lc;L=CreatDuLinkList();while(!quit){switch(scan())case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);ListInsert_DuL(L,i,e);LinkListPrint_DuL(L);break;case 2:if(DuLinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);ListDelete_DuL(L,i);}LinkListPrint_DuL(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateDuLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;case 4:La=CreatDuLinkList();Lb=CreatDuLinkList();Mergelist_L( La, Lb, Lc);printf("\n");break;default:quit=1;printf("操作结束!");printf("\n");}}5.双向循环链表的基本操作(双向循环链表的插入、删除以及访问操作)#include<stdio.h>#include<malloc.h>#define flag 0typedef int status;typedef int ElemType;typedef struct DuLNode{ElemType data;struct DuLNode *prior;struct DuLNode *next;}DuLNode,*DuLinkList;DuLinkList InitDuLinkList(){DuLinkList L;L=(DuLinkList)malloc(sizeof(DuLNode));L->next=L; L->prior=L;return L;}DuLinkList CreatDuLinkList(){DuLinkList L=InitDuLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);while (e!=flag){p=(DuLinkList)malloc(sizeof(DuLNode));p->data=e;r->next=p;p->prior=r->next;r=p;scanf("%d",&e);}r->next=L; L->prior=r;return L;}void ListInsert_DuL(DuLinkList L, int i, ElemType e){ DuLinkList p,s;int j;j=1;p=L;while(j<i){p=p->next;j++;}if(j>i)printf("插入位置不正确\n");else {s=(DuLinkList)malloc(sizeof(DuLNode));s->data=e;s->next=p->next; p->next->prior=s;s->prior=p; p->next=s;printf("%d已插入到双向循环链表中\n",e); }}void ListDelete_DuL(DuLinkList L,int i) //删除元素{DuLinkList p,q;int j;j=1;p=L;while(p->next!=L&&j<i){p=p->next;j++;}if(p->next==L)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;q->next->prior=p;free(q);printf("第%d个元素已从双向循环链表中删除\n",i); }}void LinkListPrint_DuL(DuLinkList L){DuLinkList p;p=L->next;if(p->next==L) printf("双链表为空表\n");else{printf("链表中的元素为:\n");while(p!=L){printf("%d ",p->data);p=p->next;}}printf("\n");}int DuLinkListLength(DuLinkList L){DuLinkList p;int j;p=L->next;j=0;while(p->next!=L){j++;p=p->next;}return j;}DuLinkList LocateDuLinkList(DuLinkList L,int i){DuLinkList p;int j=1;p=L->next;while(p->next!=L&&j<i){p=p->next; j++;}if (j==i)return p;else return NULL;}int scan(){int d;printf("请选择你所要执行的双向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){ int quit=0;int i,locate;ElemType e;DuLinkList L,p;L=CreatDuLinkList();while(!quit)switch(scan()){case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);ListInsert_DuL(L,i,e);LinkListPrint_DuL(L);break;case 2:if(DuLinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);ListDelete_DuL(L,i);}LinkListPrint_DuL(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateDuLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;default:quit=1;printf("操作结束!");printf("\n");}}【小结讨论】1.通过实验,我加深了对C的工作环境及其基本操作,进一步掌握了基本函数的调用以及使用方法。
顺序表的基本操作实验报告

竭诚为您提供优质文档/双击可除顺序表的基本操作实验报告篇一:顺序表的基本操作--实验报告实验报告附:源程序:#include#definemaxsize100#defineerror0#defineok1typedefstruct{intelem[maxsize];intlast;}seqList;intInsList(seqList*L,inta,inti);intLocate(seqListL,inte);intDel(seqList*L,inti);voidmain(){inti,e,a;intlist1,list2;if(L.elem[st]==-1)seqListL;st=0;for(i=0;i list1=InsList(if(list1){}elseprintf("插入失败!");printf("要查找的元素为\n");scanf("%d",printf("插入后的顺序表为:\n");for(i=0;i list2=Locate(L,e);if(!list2)printf("该元素不存在\n");}printf("该元素所在位置的序号为:%d\n",list2);/*删除元素*/printf("是否要删除该元素?\n");intm;scanf("%d",if(m){Del(printf("删除后的顺序表为:\n");for(i=0;iintInsList(seqList*L,inta,inti)//i位置,下标i-1{for(p=L->last;p>=i-1;p--)L->elem[p+1]=L->elem[p];in tp;if(L->last>=maxsize-1){}printf("表已满,无法插入");return(error);L->elem[i-1]=a;L->last++;return(ok );intLocate(seqListL,inte){}intDel(seqList*L,inti){}for(k=i;klast;k++)L->elem[k-1]=L->elem[k];intk ;inti=0;while((ilast--;returnok;篇二:线性表的基本操作实验报告实验一:线性表的基本操作【实验目的】学习掌握线性表的顺序存储结构、链式存储结构的设计与操作。
顺序表的基本操作

采用的数据描述为:顺序表在C语言中用一维数组表示。
(1)定义线性表
#define MAXLEN 50/*线性表的最大长度*/
typedef struct{int elem[MAXLEN];/*顺序表中存放元素的数组*/
int last;/*顺序表的长度,即元素个数*/
}Sqlisttp;
3.对顺序表进行元素的删除操作
三、实验步骤:
1)输入一个顺序表,并输出,验证输入的内容与输出的内容是否一致。
2)实现顺序表的插入操作(在第I个元素之前插入一个元素,即将线性表中从第I个元素开始的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置)。
3)实现顺序表的删除操作(删除第I个元素,即把第I个元素之后的所有元素前移一个位置)。
st--;}/*顺序表V的长度减1*/
return V;}
(4)顺序表元素输出函数
void display(Sqlisttp V)
{ int j;
for(j=0;j<=st-1;j++) printf("%d ",V.elem[j]);
printf("\n"); }
(5)主函数
main()
return V;}
(3)在顺序表V中删除第i个元素
Sqlisttp delete(Sqlisttp V,int i)
{int j;
if(i<1||i>st) printf("ERROR!");/*删除位置不正确则出错*/
else { for(j=i;j<=st-1;j++)
V.elem[j-1]=V.elem[j];/*将第i+1个元素及后继元素位置向前移一位*/
数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版数据结构(C语言版)课后习题答案完整版一、数据结构概述数据结构是计算机科学中一个重要的概念,用来组织和存储数据,使之可以高效地访问和操作。
在C语言中,我们可以使用不同的数据结构来解决各种问题。
本文将提供完整版本的C语言数据结构的课后习题答案。
二、顺序表1. 顺序表的定义和基本操作顺序表是一种线性表,其中的元素在物理内存中连续地存储。
在C 语言中,我们可以通过定义结构体和使用指针来实现顺序表。
以下是顺序表的一些基本操作的答案:(1)初始化顺序表```ctypedef struct{int data[MAX_SIZE];int length;} SeqList;void InitList(SeqList *L){L->length = 0;}```(2)插入元素到顺序表中```cbool Insert(SeqList *L, int pos, int elem){if(L->length == MAX_SIZE){return false; // 顺序表已满}if(pos < 1 || pos > L->length + 1){return false; // 位置不合法}for(int i = L->length; i >= pos; i--){L->data[i] = L->data[i-1]; // 向后移动元素 }L->data[pos-1] = elem;L->length++;return true;}```(3)删除顺序表中的元素```cbool Delete(SeqList *L, int pos){if(pos < 1 || pos > L->length){return false; // 位置不合法}for(int i = pos; i < L->length; i++){L->data[i-1] = L->data[i]; // 向前移动元素 }L->length--;return true;}```(4)查找顺序表中的元素```cint Search(SeqList L, int elem){for(int i = 0; i < L.length; i++){if(L.data[i] == elem){return i + 1; // 找到元素,返回位置 }}return -1; // 未找到元素}```2. 顺序表习题解答(1)逆置顺序表```cvoid Reverse(SeqList *L){for(int i = 0; i < L->length / 2; i++){int temp = L->data[i];L->data[i] = L->data[L->length - 1 - i]; L->data[L->length - 1 - i] = temp;}}```(2)顺序表元素去重```cvoid RemoveDuplicates(SeqList *L){for(int i = 0; i < L->length; i++){for(int j = i + 1; j < L->length; j++){if(L->data[i] == L->data[j]){Delete(L, j + 1);j--;}}}}```三、链表1. 单链表单链表是一种常见的链式存储结构,每个节点包含数据和指向下一个节点的指针。
顺序表的基本操作--实验报告

实验报告附:源程序:#include<stdio.h>#define Maxsize 100#define error 0#define ok 1typedef struct{int elem[Maxsize];int last;}SeqList;int InsList(SeqList *L,int a,int i); int Locate(SeqList L,int e);int Del(SeqList *L,int i);void main(){int i,e,a;int list1,list2;SeqList L;st=0;for(i=0;i<100;i++){printf("请输入顺序表元素\n");scanf("%d",&L.elem[i]);if(L.elem[i]==-1)break;st++;}if(L.elem[st]==-1)st--;printf("要插入的元素,位置为\n"); scanf("%d,%d",&a,&i);list1=InsList(&L,a,i);if(list1){printf("插入后的顺序表为:\n");for(i=0;i<=st;i++)printf("%d",L.elem[i]);printf("\n");}elseprintf("插入失败!");printf("要查找的元素为\n");scanf("%d",&e);list2=Locate(L,e);if(!list2)printf("该元素不存在\n");elseprintf("该元素所在位置的序号为:%d\n",list2);/*删除元素*/printf("是否要删除该元素?<是请输入1 ,否请输入0 >\n");int m;scanf("%d",&m);if(m){Del(&L,list2);printf("删除后的顺序表为:\n");for(i=0;i<=st;i++)printf("%d",L.elem[i]);printf("\n");}else printf("未删除元素%d\n",e);}int InsList(SeqList *L,int a,int i)//i位置,下标i-1{int p;if(L->last>=Maxsize-1){printf("表已满,无法插入");return(error);}for(p=L->last;p>=i-1;p--)L->elem[p+1]=L->elem[p];L->elem[i-1]=a;L->last++;return(ok);}int Locate(SeqList L,int e){int i=0;while((i<=st)&&(L.elem[i]!=e)) i++;if (i<=st)return(i+1);else return(error);}int Del(SeqList *L,int i){int k;for(k=i;k<=L->last;k++)L->elem[k-1]=L->elem[k];L->last--;return ok;}。
顺序表的基本操作

建立顺序表实现顺序表的基本操作2011-9-12 16:10提问者:浚痕|浏览次数:1361次(1)建立4个元素的顺序表SqList={2,3,4,5},实现顺序表的基本操作;(2)在SqList={2,3,4,5}的元素4与5之间插入一个元素9,实现顺序表插入的基本操作;(3)在SqList={2,3,4,9,5}中删除指定位置(i=3)上的元素,实现顺序表删除的操作#include <iostream.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 10#define LISTINCREMENT 2typedef struct shunxubiao{ElemType *list;int size;int Maxsize;}SqList;int InitList_Sq(SqList &L){// 构造一个空的线性表L。
L.list = new ElemType[LIST_INIT_SIZE];if (!L.list) return OVERFLOW; // 存储分配失败L.size = 0; // 长度为0L.Maxsize = LIST_INIT_SIZE; // 初始存储容量return OK;} // InitList_Sqint InsertList_Sq(SqList &L, int i, ElemType e){ElemType *p,*q;if (i < 1 || i > L.Maxsize+1) return ERROR;q = &(L.list[i-1]); // q指示插入位置for (p=&(L.list[L.Maxsize-1]); p >= q; --p)*(p+1) = *p;// 插入位置及之后的元素右移*q = e; // 插入e++L.size; // 表长增1return OK;} // ListInsert_Sqint LocateElem_Sq(SqList L, ElemType e) {// 在顺序表中查询数据元素e,若存在,则返回它的位序,否则返回0 int i = 1; // i 的初值为第1 元素的位序ElemType *p = L.list; // p 的初值为第1 元素的存储位置while (i <= L.size && *p!=e){++i;++p;}if (i <= L.size) return i;else return 0;}Status InsertList_Sq(SqList &L,ElemType e,ElemType f,ElemType g) {int i=LocateElem_Sq(L,e);int j=LocateElem_Sq(L,f);if(i==j-1){InsertList_Sq(L,j,g);return OK;}else return ERROR;}int GetList_Sq(SqList L,int i){if(i>0 && i<=L.size){return L.list[i];}elsereturn ERROR;}Status ListDelete_Sq(SqList &L, int i, ElemType &e){ElemType *p,*q;if ((i < 1) || (i > L.Maxsize)) return ERROR;p = &(L.list[i-1]); // p为被删除元素的位置e = *p; // 被删除元素的值赋给eq = L.list+L.size-1; // 表尾元素的位置for (++p; p <= q; ++p)*(p-1) = *p; // 被删除元素之后的元素左移--L.size; // 表长减1return OK;} // ListDelete_Sqvoid Create_Sq(SqList &L){cout<<"创建顺序表"<<endl;cout<<"请输入元素个数:";int count;cin>>count;for(int i=0;i<count;i++){cout<<"请输入第"<<i+1<<"个数:";cin>>L.list[i];++L.size;}}void Print_Sq(SqList &L){cout<<"输出顺序表:"<<endl;for(int i=0;i<L.size;i++)cout<<L.list[i]<<" ";}void main(){SqList myList;ElemType e,f,g,sc;InitList_Sq(myList);Create_Sq(myList);cout<<"请输入要插入顺序表的元素:"<<endl;cin>>g;cout<<"请输入新插入元素在顺序表中哪两个元素之间:"<<endl;cin>>e>>f;if(!InsertList_Sq(myList,e,f,g))cout<<"插入的位置不对!"<<endl;cout<<"删除一个元素,请输入要删除的位序:"<<endl;int wx;cin>>wx;if(!ListDelete_Sq(myList,wx,sc))cout<<"删除元素失败!"<<endl;Print_Sq(myList);}链表基本操作练习(C语言)2011-9-1 19:40提问者:追觉者|浏览次数:440次1 链表初始化创建一个链表。
顺序表的基本操作与应用实验报告

实验报告课程名称数据结构实验名称顺序表基本操作与应用姓名专业班级学号试验日期试验地点E3-502指导老师邹汉斌成绩一、实验目的1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。
3.掌握对多函数程序的输入、编辑、调试和运行过程。
二、实验要求1.预习C语言中结构体的定义与基本操作方法。
2.对顺序表的每个基本操作用单独的函数实现。
3.编写完整程序完成下面的实验内容并上机运行。
4.整理并上交实验报告。
三、实验内容:1.编写程序实现顺序表的下列基本操作:(1) 初始化顺序表La;(2) 将La置为空表;(3) 销毁La (4) 在La中插入一个新的元素;(5) 删除La中的某一元素;(6) 在La中查找某元素,若找到,则返回它在La中第一次出现的位置,否则返回0 ;(7) 打印输出La中的元素值。
2.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:(1) 根据指定学生个数,逐个输入学生信息;(2) 逐个显示学生表中所有学生的相关信息;(3) 根据姓名进行查找,返回此学生的学号和成绩;(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);(5) 给定一个学生信息,插入到表中指定的位置;(6) 删除指定位置的学生记录;(7) 统计表中学生个数。
实验提示:第2题可在第1题的基础上将数据结构的定义修改成下面形式后,程序适当修改即可。
学生信息的定义:typedef struct {char no[8]; //8位学号char name[20]; //姓名int score; //成绩}Student;typedef Student ElemType;顺序表的定义typedef struct {ElemType *elem; //指向数据元素的基地址int length; //线性表的当前长度}SqList;四、思考与提高1.编写程序完成下面的操作:(每位同学必做)(1)构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列;(2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列;(3)假设两个顺序线性表La和Lb 分别表示两个集合A和B,利用union_Sq操作实现A=A∪B。
数位顺序表简单知识点

数位顺序表简单知识点数位顺序表是计算机中常用的数据结构之一,用于存储和操作数字。
它按照数位的顺序将数字分解为各个数位,以便进行相应的操作和计算。
本文将介绍数位顺序表的基本概念、应用场景以及相关的操作和算法。
一、数位顺序表的定义和结构数位顺序表是一种线性表,它由一个个数位元素组成,每个数位元素都包含一个数字和一个指针,用来指向下一个数位元素。
数位顺序表的头指针指向第一个数位元素,尾指针指向最后一个数位元素,以便快速定位和操作。
二、数位顺序表的应用场景数位顺序表主要用于处理数字的各个数位,常见的应用场景包括:1. 数字运算:数位顺序表可以方便地进行数字加减乘除、取模和取余等运算,特别适用于大整数的计算。
2. 数字转换:数位顺序表可以将一个数字转换为字符串或字符数组,以便于输出和处理。
3. 数字统计:数位顺序表可以统计一个数字中各个数位的出现次数,或者判断一个数字是否存在重复的数位。
4. 数字排序:数位顺序表可以对一组数字进行排序,根据各个数位的大小进行比较和交换。
三、数位顺序表的基本操作1. 初始化:创建一个空的数位顺序表,并初始化头指针和尾指针。
2. 插入元素:在数位顺序表的尾部插入一个新的数位元素,更新尾指针。
3. 删除元素:删除数位顺序表的尾部元素,更新尾指针。
4. 查找元素:根据指定的位置,查找并返回对应的数位元素。
5. 修改元素:根据指定的位置,修改对应的数位元素的值。
6. 遍历元素:按照顺序依次访问数位顺序表中的每个数位元素。
四、数位顺序表的常用算法1. 数位求和:将两个数位顺序表相同位置的数位元素相加,得到一个新的数位顺序表。
2. 数位比较:比较两个数位顺序表的大小,根据数位元素的大小关系进行比较。
3. 数位排序:将一个数位顺序表中的数位元素按照大小进行排序,可以使用冒泡排序、插入排序或快速排序等算法。
五、数位顺序表的优缺点1. 优点:数位顺序表可以高效地处理数字的各个数位,适用于大整数的计算和处理,具有较高的灵活性和准确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
顺序表的基本操作/*sqList.h 文件*/#define LIST_INIT_SIZE 50 /*初始分配的顺序表长度*/#define INCREM 10 /*溢出时,顺序表长度的增量*/#define OVERFLOW 1#define OK 0#define ERROR -1typedef int ElemType; /*定义表元素的类型*/typedef struct SqList{ElemType *elem; /*存储空间的基地址*/int length; /*顺序表的当前长度*/int listsize; /*当前分配的存储空间*/}SqList;/*sqListOp.h 文件*/#include "Sqlist.h"int InitList_sq(SqList &L); //顺序表创建函数定义void FreeList_sq(SqList &L); //顺序表销毁函数定义int ListInsert_sq(SqList &L, int i, ElemType e); //在顺序表的位置i插入元素evoid PrintList_sq(SqList &L); //遍历并输出顺序表所有元素int ListDelete_sq(SqList &L, int i,ElemType &e); //删除顺序表第i个元素的bool ListEmpty(SqList &L); //判断顺序表是否为空int LocateElem_sq(SqList L,ElemType e); //在顺序表里查找出第1个与e相等的数据元素位置//已知线性表La和Lb的元素按值非递减排列//归并后的La和Lb得到新的顺序线性表Lc,Lc的元素也是按值非递减排列void MergeList_sq(SqList La,SqList Lb, SqList &Lc);/*sqListOp.cpp文件*/#include <malloc.h>#include <stdio.h>#include <stdlib.h>#include "sqlistOp.h"//创建顺序表int InitList_sq(SqList &L) {L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem) exit(OVERFLOW); /*初始化失败,返回0*/L.length = 0; /*置空表长度为0*/L.listsize = LIST_INIT_SIZE; /*置初始空间容量*/return OK; /*初始化成功,返回1*///销毁顺序表void FreeList_sq(SqList &L){if (L.elem)free(L.elem);printf("完成链表内存销毁\n");}//在顺序表的第i个位置之前插入新元素int ListInsert_sq(SqList &L, int i, ElemType e){int k;if (i<1 || i>L.length + 1) return ERROR; /*插入位置不合法*/if (L.length >= L.listsize){ /*存储空间满,重新分配空间*/L.elem = (ElemType*)realloc(L.elem, (LIST_INIT_SIZE + INCREM)*sizeof(ElemType));if (!L.elem) return OVERFLOW; /*存储分配失败*/L.listsize += INCREM; /*修改存储空间大小*/}for (k = L.length - 1; k >= i - 1; k--){ /*插入位置之后元素后移*/L.elem[k + 1] = L.elem[k];}L.elem[i - 1] = e; /*插入元素*/L.length++; /*顺序表长度加1*/return OK;}/*ListInsert*///遍历并输出顺序表所有元素void PrintList_sq(SqList &L){if (!L.elem)return;int i = 0;for (i = 0; i < L.length; i++)printf("第[%d]元素= [%d]\n", i, L.elem[i]);}//删除顺序表第i个位置的元素int ListDelete_sq(SqList &L, int i,ElemType &e){int k;if (i<1 || i>L.length) return ERROR; /*删除位置不合法*/e = L.elem[i-1];for (k = i - 1; k<L.length - 1; k++) /*元素前移*/L.elem[k] = L.elem[k + 1];L.length--; /*顺序表长度减1*/return OK;}//在顺序表里查找出第1个与e相等的数据元素位置int LocateElem_sq(SqList L,ElemType e){while(i<=L.length){if(L.elem[i] == e)break;elsei++;}if(i<=L.length) return i;return -1;}//已知线性表La和Lb的元素按值非递减排列//归并后的La和Lb得到新的顺序线性表Lc,Lc的元素也是按值非递减排列void MergeList_sq(SqList La,SqList Lb, SqList &Lc){ElemType *pa = La.elem;ElemType *pb = Lb.elem;Lc.listsize = Lc.length = La.length + Lb.length;if(!Lc.elem) exit(OVERFLOW); //存储分配失败int i = 0,j = 0; //书上合并的算法采用指针方式,这里采用简单点的方法int k =0;//i指向La的当前位置,j指向Lb当前位置,k指向Lc当前位置while(i<La.length && j<Lb.length){ //归并if(La.elem[i]<Lb.elem[j]){Lc.elem[k] = La.elem[i];i++;}else{Lc.elem[k] = Lb.elem[j];j++;}k++;}while(i<La.length) Lc.elem[k++] = La.elem[i++];while(j<La.length) Lc.elem[k++] = Lb.elem[j++];}//MergeList_sqbool ListEmpty(SqList &L){ //判断顺序表是否为空if(L.length > 0)return 1;elsereturn 0;}/* main.cpp 文件*/#include <stdio.h>#include <malloc.h>#include "sqlistOp.h"void main(){SqList L;printf("准备创建顺序表\n");if (OK != InitList_sq(L)){printf("顺序表创建出错\n");}if(ListEmpty(L))printf("表不为空\n");elseprintf("表为空\n");int i = 0;for (i = 1; i <= 20; i++)ListInsert_sq(L, i, 2 * i);printf("准备遍历并输出顺序表\n");PrintList_sq(L);getchar();printf("在第10个位置插入值为99的元素后再遍历输出顺序表\n"); ListInsert_sq(L, 10, 99);PrintList_sq(L);getchar();printf("删除第10个元素后再遍历输出顺序表\n");ElemType e;ListDelete_sq(L,10,e);PrintList_sq(L);printf("删除的数据元素值= %d \n",e);getchar();printf("查找出一个数据元素的在顺序表中的位置\n");i = LocateElem_sq(L,20);if(-1 == i)printf("顺序表不包含这个数据元素\n");elseprintf("元素在顺序表的位置= %d\n",i);printf("创建另一个顺序表\n");SqList Lb;if (OK != InitList_sq(Lb)){printf("顺序表创建出错\n");}for (i = 1; i <= 10; i++)ListInsert_sq(Lb, i, 2 * i-1);printf("准备遍历并输出顺序表\n");PrintList_sq(Lb);SqList Lc;if (OK != InitList_sq(Lc)){printf("顺序表创建出错\n");}printf("将两个顺序表合并打印合并后的顺序表\n");MergeList_sq(L, Lb, Lc);PrintList_sq(Lc);printf("准备销毁顺序表\n");FreeList_sq(L);FreeList_sq(Lb);FreeList_sq(Lc);getchar();}// 单链表的操作/*linkList.h 文件*/#define INIT_SIZE 50 /*初始分配的顺序表长度*/#define INCREM 10 /*溢出时,顺序表长度的增量*/enum Status {OK,ERROR};typedef int ElemType; /*定义表元素的类型*/typedef struct LNode{ElemType data; /*结点的数据域*/struct LNode *next; /*结点的指针域*/}LNode, *LinkList;/*linkListOp.h 文件*/#include "linkList.h"LinkList InitList_L(); //创建单链表头结点void CreateList_L(LinkList &L,int n); //创建单链表头结点和n个元素结点Status ListInsert_L(LinkList &L, int i, ElemType e); //在单链表的第i个位置之前插入新元素x void PrintList_L(LinkList L); //遍历并输出单链表所有元素Status ListDelete_L(LinkList &L, int i, ElemType &e);//删除单链表第i个位置的元素Status GetElem_L(LinkList L,int i,ElemType &e);//获取单链表第i个位置的元素int LocateElem_L(LinkList L,ElemType e); //查找出第1个与e相等的数据元素位置void ListConvert_L(LinkList &L); //单链表翻转void FreeList_L(LinkList L); //销毁单链表/*linkListOp.cpp文件*/#include <malloc.h>#include <stdio.h>#include "linklistOp.h"//初始化线性单表,即创建一个头结点LinkList InitList_L() {LinkList H = (LinkList)malloc(sizeof(LNode)); /*申请一个头结点*/if (!H) return NULL; /*申请失败*/H->next = NULL; /*头结点的指针域置空*/return H;}//创建n个结点的单链表,包括所有链表节点void CreateList_L(LinkList &L,int n){//逆位序输入n个元素的值,建立带表头结点的单链表LL = (LinkList)malloc(sizeof(LNode));L->next = NULL; //建立一个带头结点的单链表for(int i= n; i > 0; i--){LinkList p = (LinkList)malloc(sizeof(LNode)); //生成新结点p->data = 2*i; //输入元素值p->next = L->next; //插入到表头L->next = p;}}//在顺序表里查找出第1个与e相等的数据元素位置int LocateElem_L(LinkList L,ElemType e){int i = 1;LinkList p = L->next;while(p){if(p->data == e)break;else{p = p->next;i++;}}if(p) return i;return 0;}//销毁单链表表void FreeList_L(LinkList L){LinkList p = L;while (p){L = L->next;free(p);p = L;}}//在单链表的第i个位置之前插入新元素Status ListInsert_L(LinkList &L, int i, ElemType e){LinkList p = L;int j = 0;while(p && j<i-1){ //寻找第i-1个结点p = p->next;++j;}if(!p || j>i) return ERROR;LinkList s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return OK;}//遍历并输出单链表所有元素void PrintList_L(LinkList L){int i = 0;LinkList p = L->next;while (p){printf("第[%d]元素= [%d]\n", i++, p->data);p = p->next;}}//获取单链表第i个位置的元素Status GetElem_L(LinkList L,int i,ElemType &e){//L为带头结点的单链表的头指针//当第i个元素存在,其值赋给e并返回OK,否则饭否ERROR LinkList p = L->next;int j = 1;while(p && j<i){p = p->next;++j;}if(!p) return ERROR;//第i个元素不存在e = p->data;return OK;}//删除单链表第i个位置的元素,并由e返回其值Status ListDelete_L(LinkList &L, int i, ElemType &e){LinkList p = L;int j = 0;while(p->next && j<i-1){ //寻找第i个结点,并令p指向其前驱p = p->next;++j;}if(!p->next || j>i-1) return ERROR; //删除位置不合理LinkList q = p->next;p->next = q->next;e = q->data;free(q);return OK;}//单链表翻转,不增加额外的存储空间void ListConvert_L(LinkList &L){LinkList p,q;p=L->next;L->next=NULL;while(p){q=p;p=p->next;q->next=L->next;L->next=q;}}/*main.cpp文件*/#include <stdio.h>#include <malloc.h>#include "linklistOp.h"void main(){printf("准备创建单链表\n");LinkList L;CreateList_L(L,20);printf("准备遍历并输出单链表\n");PrintList_L(L);getchar();printf("在第10个位置插入值为99的元素后再遍历输出单链表\n");ListInsert_L(L, 10, 99);PrintList_L(L);getchar();printf("删除第10个元素后再遍历输出单链表\n");ElemType e;ListDelete_L(L,10,e);PrintList_L(L);printf("删除的元素值= %d\n",e);getchar();printf("获取第10个元素\n");GetElem_L(L,10,e);printf("获取到的元素值e = %d\n",e);getchar();printf("查找数据元素14在单链表的位置\n");int idx = LocateElem_L(L,14);printf("14在单链表的位置= %d\n",idx);getchar();printf("单链表翻转操作\n");ListConvert_L(L);PrintList_L(L);getchar();printf("单链表翻转操作\n");ListConvert_L(L);PrintList_L(L);getchar();printf("准备销毁单链表\n");FreeList_L(L);getchar();}/*sqStack.h文件*/#define INIT_SIZE 100#define INCREMENT 10//typedef int ElemType;typedef char ElemType;typedef struct SqStack {ElemType *base;ElemType *top;int stacksize;}SqStack;enum Status{OK,ERROR,OVERFLOW};/*sqStackOp.h文件*/#include "sqStack.h"Status InitStack(SqStack &S) ;Status GetTop(SqStack S,ElemType &e);Status Push(SqStack &S,ElemType e);Status Pop(SqStack &S,ElemType &e);bool StackEmpty(SqStack &S);/*sqStackOp.cpp文件*/#include <malloc.h>#include <stdlib.h>#include "sqStackOp.h"Status InitStack(SqStack &S) {//构造一个空的栈S.base=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(! S.base) exit(OVERFLOW); //存储分配失败S.top=S.base;S.stacksize=INIT_SIZE;return OK;} //InitStackStatus GetTop(SqStack S,ElemType &e){//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base) return ERROR;e=*(S.top-1);return OK;} //GetTopStatus Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){ //栈满,追加存储空间S.base=(ElemType *)realloc(S.base,(S.stacksize+INCREMENT)*sizeof(ElemType));if(!S.base)exit(OVERFLOW); //存储分配失败S.top=S.base+S.stacksize;S.stacksize+=INCREMENT;}*S.top++=e;return OK;} //PushStatus Pop(SqStack &S,ElemType &e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base) return ERROR;e=*(--S.top);return OK;} //Push//判断栈是否为空bool StackEmpty(SqStack &S){if(S.top == S.base)return true;elsereturn false;}/*main.cpp文件*/#include <stdio.h>#include <stdlib.h>#include "sqStackOp.h"void main(){printf("Hellow stack \n");SqStack S; //定义顺序栈Sif(OK != InitStack(S)) {printf("顺序栈初始化出错,退出....\n");exit(-1);}Push(S, 1);Push(S,2);Push(S,3);int e;Pop(S, e);printf("出栈元素= %d \n",e);Push(S,4);Push(S,5);while(!StackEmpty(S)){Pop(S, e);printf("出栈元素= %d \n",e);}/*SqStack S; char x,y;InitStack(S); x='c';y='k';Push(S,x); Push(S,'a'); Push(S,y);Pop(S,x); Push(S,'t'); Push(S,x);Pop(S,x); Push(S,'s');while(!StackEmpty(S)){ Pop(S,y);printf("%c ",y); };printf("%c ",x);*/getchar();}实验内容(2)参考程序/*sqStack.h文件*/#define INIT_SIZE 100#define INCREMENT 10typedef int ElemType;typedef struct SqStack {ElemType *base;ElemType *top;int stacksize;}SqStack;enum Status{OK,ERROR,OVERFLOW};/*sqStackOp.h文件*/#include "sqStack.h"Status InitStack(SqStack &S) ;Status GetTop(SqStack S,ElemType &e);Status Push(SqStack &S,ElemType e);Status Pop(SqStack &S,ElemType &e);bool StackEmpty(SqStack &S);/*sqStackOp.cpp文件*/#include <malloc.h>#include <stdlib.h>#include "sqStackOp.h"Status InitStack(SqStack &S) {//构造一个空的栈S.base=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(! S.base) exit(OVERFLOW); //存储分配失败S.top=S.base;S.stacksize=INIT_SIZE;return OK;} //InitStackStatus GetTop(SqStack S,ElemType &e){//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base) return ERROR;e=*(S.top-1);return OK;} //GetTopStatus Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){ //栈满,追加存储空间S.base=(ElemType *)realloc(S.base,(S.stacksize+INCREMENT)*sizeof(ElemType));if(!S.base)exit(OVERFLOW); //存储分配失败S.top=S.base+S.stacksize;S.stacksize+=INCREMENT;}*S.top++=e;return OK;} //PushStatus Pop(SqStack &S,ElemType &e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base) return ERROR;e=*(--S.top);return OK;} //Push//判断栈是否为空bool StackEmpty(SqStack &S){if(S.top == S.base)return true;elsereturn false;}/*main.cpp文件*/#include <stdio.h>#include <stdlib.h>#include "sqStackOp.h"void main(){SqStack s;int x;InitStack(s);scanf("%d",&x); //%d--十进制输入;%O--八进制输入;%x--十六进制输入//修改这里输入进制和下面整除和余数计算,就可以获得其他进制的转换while(x!=0){Push(s,x%8);x=x/8;}while(!StackEmpty(s)){Pop(s,x);printf("%d ",x);}printf("\n");getchar();}实验内容(3)参考程序/*sqQueue.h 文件*/#define MAXQSIZE 100typedef int QElemType;typedef struct SqQueue {QElemType *base;int front;int rear;}SqQueue;enum Status{OK,ERROR,OVERFLOW};/*sqQueueOp.h 文件*/#include "sqQueue.h"Status InitQueue (SqQueue &Q) ;Status EnQueue (SqQueue &Q, QElemType e);Status DeQueue (SqQueue &Q, QElemType &e) ;bool QueueEmpty(SqQueue &Q);int QueueLength(SqQueue Q);/*sqQueueOp.cpp 文件*/#include <malloc.h>#include <stdlib.h>#include "sqQueueOp.h"Status InitQueue (SqQueue &Q) {// 构造一个空队列QQ.base = (QElemType *) malloc(MAXQSIZE *sizeof (QElemType));if (!Q.base) exit (OVERFLOW);// 存储分配失败Q.front = Q.rear = 0;return OK;}Status EnQueue (SqQueue &Q, QElemType e) { // 插入元素e为Q的新的队尾元素if ((Q.rear+1) % MAXQSIZE == Q.front)return ERROR; //队列满Q.base[Q.rear] = e;Q.rear = (Q.rear+1) % MAXQSIZE;return OK;}Status DeQueue (SqQueue &Q, QElemType &e) { // 若队列不空,则删除Q的队头元素,// 用e返回其值,并返回OK; 否则返回ERRORif (Q.front == Q.rear) return ERROR;e = Q.base[Q.front];Q.front = (Q.front+1) % MAXQSIZE;return OK;}//判断队列是否为空bool QueueEmpty(SqQueue &Q){if(Q.front== Q.rear)return true;elsereturn false;}//计算循环队列长度int QueueLength(SqQueue Q){return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;}/*main.cpp 文件*/#include <stdio.h>#include <stdlib.h>#include "sqQueueOp.h"void main(){printf("Hello Queue \n");SqQueue Q; //定义顺序队列QQElemType e;if(OK != InitQueue(Q)) {printf("顺序队列初始化出错,退出....\n");exit(-1);}EnQueue(Q,1);EnQueue(Q,3);EnQueue(Q,5);EnQueue(Q,7);printf("当前队列长度= %d \n",QueueLength(Q));DeQueue(Q,e);printf("队首元素%d出队,当前队列长度=%d\n",e,QueueLength(Q));EnQueue(Q,9);EnQueue(Q,11);while(!QueueEmpty(Q)){DeQueue(Q,e);printf("队首元素%d出队,当前队列长度=%d\n",e,QueueLength(Q));}getchar();}实验内容(4)参考程序/*linkQueue.h 文件*/typedef int QElemType;typedef struct QNode {// 结点类型QElemType data;struct QNode *next;} QNode, *QueuePtr;typedef struct { // 链队列类型QueuePtr front; // 队头指针QueuePtr rear; // 队尾指针} LinkQueue;enum Status{OK,ERROR,OVERFLOW};/*linkQueueOp.h 文件*/#include "linkQueue.h"Status InitQueue (LinkQueue &Q) ;Status EnQueue (LinkQueue &Q, QElemType e); Status DeQueue (LinkQueue &Q, QElemType &e) ; bool QueueEmpty(LinkQueue &Q);/*linkQueueOp.cpp 文件*/#include <malloc.h>#include <stdlib.h>#include "linkQueueOp.h"Status InitQueue (LinkQueue &Q) {// 构造一个空队列QQ.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if (!Q.front) exit (OVERFLOW);//存储分配失败Q.front->next = NULL;return OK;}Status EnQueue (LinkQueue &Q, QElemType e) { // 插入元素e为Q的新的队尾元素QueuePtr p = (QueuePtr) malloc (sizeof (QNode));if (!p) exit (OVERFLOW); //存储分配失败p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return OK;}Status DeQueue (LinkQueue &Q, QElemType &e) {// 若队列不空,则删除Q的队头元素,//用e 返回其值,并返回OK;否则返回ERROR if (Q.front == Q.rear) return ERROR;QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p) Q.rear = Q.front;free (p);return OK;}//判断队列是否为空bool QueueEmpty(LinkQueue &Q){if(Q.front == Q.rear)return true;elsereturn false;}/*main.cpp 文件*/#include <stdio.h>#include <stdlib.h>#include "linkQueueOp.h"void main(){printf("Hello LinkQueue \n");LinkQueue Q; //定义顺序队列QQElemType e;if(OK != InitQueue(Q)) {printf("顺序队列初始化出错,退出....\n");exit(-1);}EnQueue(Q,1);EnQueue(Q,3);EnQueue(Q,5);EnQueue(Q,7);DeQueue(Q,e);printf("队首元素%d出队,\n",e);EnQueue(Q,9);EnQueue(Q,11);while(!QueueEmpty(Q)){DeQueue(Q,e);printf("队首元素%d出队,\n",e);}getchar();}typedef char TElemType;typedef struct BiTNode { // 结点结构TElemType data;struct BiTNode *lchild, *rchild;// 左右孩子指针} BiTNode, *BiTree;enum Status {ERROR = 0,OK = 1,OVERFLOW = 2};/* biTreeOp.h 文件*/#include "biTree.h"//按先序次序输入二叉树中结点中的值,以链式存储Status CreateBiTree(BiTree & T);//对链式存储的二叉树先序遍历Status PreOrderTraverse(BiTree T);//对链式存储的二叉树中序遍历Status InOrderTraverse(BiTree T);//对链式存储的二叉树后序遍历Status PostOrderTraverse(BiTree T);//对链式存储的二叉树层序遍历Status LevelOrderTraverse(BiTree T);//对链式存储的二叉树先序遍历Status FreeBiTree(BiTree T);/* biTreeOp.cpp 文件*/#include <stdio.h>#include <stdlib.h>#include "biTreeOp.h"//#include "sqQueueOp.h"//按先序次序输入二叉树中结点中的值,以链式存储Status CreateBiTree(BiTree & T){char ch;scanf("%c",&ch);if( '#' == ch ) T = NULL;else {if(!(T = (BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return OK;}//对链式存储的二叉树先序遍历Status PreOrderTraverse(BiTree p){if ( p!= NULL ) {printf("%c ",p->data);PreOrderTraverse(p->lchild);PreOrderTraverse(p->rchild);return OK;}elsereturn OK;}//PreOrderTraverse//对链式存储的二叉树中序遍历Status InOrderTraverse(BiTree p){if ( p!= NULL ) {InOrderTraverse(p->lchild);printf("%c ",p->data);InOrderTraverse(p->rchild);return OK;}elsereturn OK;}//InOrderTraverse//对链式存储的二叉树后序遍历Status PostOrderTraverse(BiTree p){if ( p!= NULL ) {PostOrderTraverse(p->lchild);PostOrderTraverse(p->rchild);printf("%c ",p->data);return OK;}elsereturn OK;}//PostOrderTraverse//对链式存储的二叉树层序遍历//需要使用队列进行辅助Status LevelOrderTraverse(BiTree T){BiTNode *q[100],*p;int head,tail;q[0]=T;head=0;tail=1;while(head<tail) { /* 当队列不空*/p=q[head++];printf("%c ",p->data);if(p->lchild!=NULL)q[tail++]=p->lchild;if(p->rchild!=NULL)q[tail++]=p->rchild;}return OK;}/*main.cpp 文件*/#include <stdio.h>#include "biTreeOp.h"void main(){BiTNode *T;printf("\nplease input node value(P127 Figure6.8):such as 'abc##de#g##f###'\n");CreateBiTree(T);printf("\nPreOrder:\n");PreOrderTraverse(T);printf("\n");getchar();printf("\nInOrder:\n");InOrderTraverse(T);printf("\n");getchar();printf("\nPostOrder:\n");PostOrderTraverse(T);printf("\n");getchar();printf("\nLevelOrder:\n");LevelOrderTraverse(T);printf("\n");getchar();}实验内容(4)中计算二叉树深度参考代码/* biTree.h 文件*/typedef char TElemType;typedef struct BiTNode { // 结点结构TElemType data;struct BiTNode *lchild, *rchild;// 左右孩子指针} BiTNode, *BiTree;enum Status {ERROR = 0,OK = 1,OVERFLOW = 2};/*treeDepth.h 文件*/#include "biTree.h"//按先序次序输入二叉树中结点中的值,以链式存储Status CreateBiTree(BiTree & T);//后序遍历计算二叉树深度int TreeDepth(BiTree T);/*treeDepth.cpp 文件*/#include <stdio.h>#include <stdlib.h>#include "treeDepth.h"//按先序次序输入二叉树中结点中的值,以链式存储Status CreateBiTree(BiTree & T){char ch;scanf("%c",&ch);if( '#' == ch ) T = NULL;else {if(!(T = (BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return OK;}//后序遍历计算二叉树深度int TreeDepth(BiTree T){int depthLeft, depthRight,depthval;if ( !T ) depthval = 0;else {depthLeft = TreeDepth( T->lchild );depthRight = TreeDepth( T->rchild );depthval = 1 + (depthLeft > depthRight ?depthLeft : depthRight);}return depthval;}//treeDepth/*main.cpp */#include <stdio.h>#include "treeDepth.h"void main(){BiTNode *T;printf("\nplease input node value(P127 Figure6.8):such as 'abc##de#g##f###'\n");CreateBiTree(T);getchar();printf("\nCountLeaf:\n");int depth=0;depth = TreeDepth(T);printf("二叉树深度= %d \n",depth);getchar();}实验内容(4)中统计二叉树叶子结点个数参考代码/*biTree.h 文件*/typedef char TElemType;typedef struct BiTNode { // 结点结构TElemType data;struct BiTNode *lchild, *rchild;// 左右孩子指针} BiTNode, *BiTree;enum Status {ERROR = 0,OK = 1,OVERFLOW = 2};/*countLeaf.h 文件*/#include "biTree.h"//按先序次序输入二叉树中结点中的值,以链式存储Status CreateBiTree(BiTree & T);//先序遍历统计叶子结点个数Status CountLeaf(BiTree T,int * count);/*countLeaf.cpp 文件*/#include <stdio.h>#include <stdlib.h>#include "countLeaf.h"//按先序次序输入二叉树中结点中的值,以链式存储Status CreateBiTree(BiTree & T){char ch;scanf("%c",&ch);if( '#' == ch ) T = NULL;else {if(!(T = (BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return OK;}//先序遍历统计叶子结点个数Status CountLeaf(BiTree p,int * pcount){if ( p!= NULL ) {if ((!p->lchild)&& (!p->rchild))(*pcount)++; // 对叶子结点计数CountLeaf( p->lchild, pcount);CountLeaf( p->rchild, pcount);return OK;}elsereturn OK;}//countLeaf/*main.cpp 文件*/#include <stdio.h>#include "countLeaf.h"void main(){BiTNode *T;printf("\nplease input node value(P127 Figure6.8):such as 'abc##de#g##f###'\n");CreateBiTree(T);getchar();printf("\nCountLeaf:\n");int count=0;CountLeaf(T, &count);printf("叶子结点个数= %d \n",count);getchar();}#include"stdio.h"#include"stdlib.h"#define Max 100 //假设文件长度typedef struct{ //定义记录类型int key; //关键字项}RecType;typedef RecType SeqList[Max+1]; //SeqList为顺序表,表中第0个元素作为哨兵int n; //顺序表实际的长度1、直接插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已排序好的子文件中的适当位置,直到全部记录插入完成为止。