顺序表的基本操作 (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. 优点:数位顺序表可以高效地处理数字的各个数位,适用于大整数的计算和处理,具有较高的灵活性和准确性。
顺序表的基本操作
《数据结构》实验报告一顺序表的基本操作班级:网络工程学号:12015242183实验日期:2016.9.25姓名:邓宗永程序文件名及说明:sequenlist 顺序表一、实验目的1、掌握使用Turbo C3.0 上机调试线性表的基本方法;2、掌握顺序表的基本操作:插入、删除、查找以及线性表合并等运算。
二、实验要求1、认真阅读和掌握实验的程序。
2、上机运行程序。
3、保存和打印出程序的运行结果,并结合程序进行分析。
4、按照你对线性表的操作需要,编写写主程序并运行,打印出文件清单和运行结果三、注意事项:在磁盘上创建一个目录,专门用于存储数据结构实验的程序。
四、实验内容1. 顺序表的查找、插入与删除。
设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。
具体实现要求:(1)从键盘输入10 个整数,产生顺序表,并输入结点值。
(2)从键盘输入 1 个整数,在顺序表中查找该结点的位置。
若找到,输出结点的位置;若找不到,则显示“找不到”。
(3)从键盘输入 2 个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x 插入在对应位置上,输出顺序表所有结点值,观察输出结果。
(4)从键盘输入 1 个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。
五、实验报告必须写明内容1. 程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)程序的结构:通过子函数实现输出,删除,插入,查找等功能,高耦合低内聚数据结构:线性结构,顺序储存输入/ 输出设计:根据屏幕提示,从键盘读取数据2. 源程序及注释:#include <stdio.h>#include <stdio.h>typedef int datatype;#define maxsize 10typedef struct // 创建一个顺序表包含10 个整数{datatype data[maxsize];int last;}sequenlist;void Delete(sequenlist *L,int i)// 删除前移节点{int j;if((i<1)||(i>L->last+1)){printf("error");}else{for(j=i;j<=L->last;j++)L->data[j-1]=L->data[j];L->last--;}}int get(sequenlist L,datatype x){ int i=0;for(i=0;i<=st;i++){if(L.data[i]==x){return i+1; break;}}return 0;}int Insert (sequenlist *L,datatype x,int i) {int j;if((L->last)>=maxsize-1){printf("overflow\n");return 0;}else{for(j=L->last;j>=i-1;j--)L->data[j+1]=L->data[j];L->data[i-1]=x;L->last=L->last+1;}return(1);}void PPrint(sequenlist L)// 输出{int i;printf("the list is \n:");for(i=0;i<= st;i++){printf("%d ",L.data[i]);}printf("\n");}int main(void){sequenlist L;datatype t,th,mh,wh,eh;int i,s;printf(" 请输入十个整数:\n");for(i=0 ;i<maxsize;i++)。
《数据结构与算法》知识点整理
《数据结构与算法》知识点整理《数据结构与算法》知识点整理1:数据结构概述1.1 什么是数据结构1.2 数据结构的作用1.3 数据结构的分类1.4 数据结构的存储方式2:线性表2.1 顺序表2.1.1 顺序表的定义2.1.2 顺序表的基本操作2.2 链表2.2.1 链表的定义2.2.2 链表的基本操作2.3 栈2.3.1 栈的定义2.3.2 栈的基本操作2.4 队列2.4.1 队列的定义2.4.2 队列的基本操作3:树3.1 树的基本概念3.1.1 结点3.1.2 父节点、子节点、兄弟节点 3.2 二叉树3.2.1 二叉树的定义3.2.2 二叉树的遍历方式3.3 平衡二叉树3.3.1 平衡二叉树的定义3.3.2 平衡二叉树的实现4:图4.1 图的基本概念4.1.1 顶点4.1.2 边4.1.3 权重4.2 图的表示方式4.2.1 邻接矩阵4.2.2 邻接表4.3 图的搜索算法4.3.1 深度优先搜索 4.3.2 广度优先搜索5:排序算法5.1 冒泡排序5.2 插入排序5.3 选择排序5.4 快速排序5.5 归并排序6:查找算法6.1 顺序查找6.2 二分查找6.3 哈希查找7:字符串匹配算法7.1 暴力匹配算法7.2 KMP算法7.3 Boyer-Moore算法8:动态规划算法8.1 动态规划的基本概念8.2 0-1背包问题8.3 最长公共子序列问题9:附件9.1 Examples:docx - 包含各章节示例代码的附件文件10:法律名词及注释10:1 数据结构 - 在计算机科学中,数据结构是计算机中存储、组织数据的方式。
10:2 线性表 - 线性表是数据元素的有限序列,元素之间具有线性关系。
10:3 顺序表 - 顺序表是用一组地址连续的存储单元依次存储线性表的元素。
10:4 链表 - 链表是一种数据元素按照顺序存放,元素之间通过指针进行关联的数据结构。
10:5 栈 - 栈是一种特殊的线性表,只能在一端进行插入和删除操作。
实验一顺序表的基本操作实验报告
元素之后的所有数据都前移一个位置,最将线性表长减1。
3.顺序表查找操作的基本步骤:要在顺序表中查找一个给定值的数据元素则可以采用顺序查找的方法,从表中第 1 个数据元素开始依次将值与给定值进行比较,若相等则返回该数据元素在顺序表中的位置,否则返回0 值。
线性表的动态分配顺序存储结构—C语言实现#define MaxSize 50//存储空间的分配量Typedef char ElemType;Typedef struct{ElemType data[MaxSize];int length; //表长度(表中有多少个元素)}SqList;动态创建一个空顺序表的算法:void InitList(SqList *&L) //初始化线性表{L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间L->length=0; //置空线性表长度为0}线性表的插入:status Sqlist_insert(Sqlist &L,int i,Elemtype x)/*在顺序表L中第i个元素前插入新元素x*/{ if (i<1||i>L.length+1) return ERROR; /*插入位置不正确则出错*/if (L.length>=MAXLEN)return OVERFLOW;/*顺序表L中已放满元素,再做插入操作则溢出*/for(j=L.length-1;j>=i-1;j--)L.elem[j+1]=L.elem[j]; /*将第i个元素及后续元素位置向后移一位*/L.elem[i-1]=x; /*在第i个元素位置处插入新元素x*/L.length++; /*顺序表L的长度加1*/return OK;}线性表的删除:status Sqlist_delete(Sqlist &L,int i,Elemtype &e)/*在顺序表L中删除第i个元素*{ if (i<1||i>L.length) return ERROR; /*删除位置不正确则出错*/for(j=i;j<=L.length-1;j++)L.elem[j-1]=L.elem[j]; /*将第i+1个元素及后继元素位置向前移一位*/L.length--;/*顺序表L的长度减1*/return OK;}线性表元素的查找:int LocateElem(SqList *L, ElemType e) //按元素值查找{int i=0;while (i<L->length && L->data[i]!=e)i++; //查找元素eif (i>=L->length) //未找到时返回0return 0;elsereturn i+1; //找到后返回其逻辑序号}输出线性表:void DispList(SqList *L) //输出线性表{int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c ",L->data[i]);printf("\n");}输出线性表第i个元素的值:bool GetElem(SqList *L,int i,ElemType &e)//求线性表中某个数据元素值{if (i<1 || i>L->length)return false; //参数错误时返回falsee=L->data[i-1]; //取元素值return true; //成功找到元素时返回true}代码:#include <stdio.h>#include <malloc.h>#define MaxSize 50typedef char ElemType;typedef struct{ElemType data[MaxSize];int length;} SqList;void InitList(SqList *&L);void DestroyList(SqList *L);bool ListEmpty(SqList *L);int ListLength(SqList *L);void DispList(SqList *L);bool GetElem(SqList *L,int i,ElemType &e);int LocateElem(SqList *L, ElemType e);bool ListInsert(SqList *&L,int i,ElemType e);bool ListDelete(SqList *&L,int i,ElemType &e);void InitList(SqList *&L)//初始化线性表{L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间L->length=0;//置空线性表长度为0 }void DestroyList(SqList *L)//销毁线性表{free(L);}bool ListEmpty(SqList *L)//判线性表是否为空表{return(L->length==0);}int ListLength(SqList *L)//求线性表的长度{return(L->length);}void DispList(SqList *L)//输出线性表{int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c ",L->data[i]);printf("\n");}bool GetElem(SqList *L,int i,ElemType &e)//求线性表中某个数据元素值{if (i<1 || i>L->length)return false;//参数错误时返回falsee=L->data[i-1];//取元素值return true;//成功找到元素时返回true}int LocateElem(SqList *L, ElemType e)//按元素值查找{int i=0;while (i<L->length && L->data[i]!=e)i++;//查找元素eif (i>=L->length)//未找到时返回0return 0;elsereturn i+1;//找到后返回其逻辑序号}bool ListInsert(SqList *&L,int i,ElemType e)//插入数据元素{int j;if (i<1 || i>L->length+1)return false;//参数错误时返回falsei--;//将顺序表逻辑序号转化为物理序号for (j=L->length;j>i;j--)//将data[i]及后面元素后移一个位置L->data[j]=L->data[j-1];L->data[i]=e;//插入元素eL->length++;//顺序表长度增1return true;//成功插入返回true}bool ListDelete(SqList *&L,int i,ElemType &e)//删除数据元素{int j;if (i<1 || i>L->length)//参数错误时返回falsereturn false;i--;//将顺序表逻辑序号转化为物理序号e=L->data[i];for (j=i;j<L->length-1;j++)//将data[i]之后的元素前移一个位置L->data[j]=L->data[j+1];L->length--;//顺序表长度减1return true;//成功删除返回true}void main(){SqList *L;ElemType e;printf("顺序表的基本运算如下:\n");printf(" (1)初始化顺序表L\n");InitList(L);printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");ListInsert(L,1,'a');ListInsert(L,2,'b');ListInsert(L,3,'c');ListInsert(L,4,'d');ListInsert(L,5,'e');printf(" (3)输出顺序表L:");DispList(L);printf(" (4)顺序表L长度=%d\n",ListLength(L));printf(" (5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));GetElem(L,3,e);printf(" (6)顺序表L的第3个元素=%c\n",e);实验结果:心得体会:通过本次实验,实现了数据结构在程序设计上的作用,了解了数据结构语言,加深了对c语言的认识掌并掌握了线性表的顺序存储结构的表示和实现方法,掌握顺序表基本操作的算法实现,同时了解了顺序表的应用。
顺序表的基本操作
2.输入5个数,分别为1,2,3,4,5
3.求线性表是否为空:
4.求线性表的长度:
5.输出顺序表的第4个元素:
6.输出第一次出现元素3的位置:
7.向线性表中插入一个元素:
8.删除元素4,并输出
9.输出线性表的元素:
10.在线性表的-1位置插入数据:
11.清空线性表的所有元素
五、实验总结
1.由于线性表是采用的是数组存储,因此,在第i个位置添加或删除
一个元素时,需要移动n-i个位置,其时间复杂度为O(n)
2.顺序表的删除并非真正意义的删除,由于数组的特殊原因,只是
显示的一种“假象”,如果采用动态的扩展空间,可以实现真正意。
数据结构实验报告-实验一顺序表、单链表基本操作的实现
数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。
(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。
(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。
l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。
顺序表的建立、输入、输出、查找、插入、删除(数据结构)
顺序表的建⽴、输⼊、输出、查找、插⼊、删除(数据结构)1.顺序表的基本操作实践。
(1)建⽴4个元素的顺序表list[]={2,3,4,5},实现顺序表建⽴的基本操作。
(2)在list[]={2,3,4,5}的元素4和5之间插⼊⼀个元素9,实现顺序表插⼊的基本操作。
(3)在list[]={2,3,4,9,5}中删除指定位置(i=3)上的元素4,实现顺序表的删除的基本操作。
#include <stdio.h>#include <stdlib.h>#include <iostream>#define MAXSIZE 10using namespace std;typedef int ElemType;typedef struct {ElemType a[MAXSIZE];int length;} S;void CreatList(S &L) {scanf("%d", &L.length);for(int i = 1; i <= L.length; i ++) scanf("%d",&L.a[i]);} //创建列表void PutList(S L) {for(int i = 1; i <= L.length; i ++) {printf("%d ",L.a[i]);}printf("\n");} //输出列表void InserElem(S &L, int i, ElemType x) { j iif(i < 1 || i > L.length) return; 2 3 4 5 9for(int j = L.length+1; j > i; j --) { j-1jL.a[j] = L.a[j-1]; 2 3 4 9 5}L.a[i] = x;L.length++;} //插⼊void DeleElem(S &L, int i) {for(int j = i; j < L.length; j ++) {L.a[j] = L.a[j+1]; j j+1} 2 3 4 9 5L.length--;}//删除int main() {S L;CreatList(L);InserElem(L,4,9);PutList(L);DeleElem(L,3);PutList(L);return0;}结果E:\c++>b42345234952395。
c++有序顺序表的建立与基本操作
c++有序顺序表的建立与基本操作【C++有序顺序表的建立与基本操作】一、引言在C++编程中,有序顺序表是非常常见的数据结构之一。
它可以帮助我们存储和操作一组有序的数据,是程序中非常实用的工具。
本文将从有序顺序表的概念入手,逐步深入探讨其建立和基本操作,帮助读者更好地理解和运用这一数据结构。
二、有序顺序表的概念有序顺序表是一种线性表,其中元素按照一定的顺序排列。
在C++中,我们通常使用数组来实现有序顺序表。
通过数组,我们可以轻松地存储一组有序的数据,并且可以方便地进行各种基本操作,如插入、删除、查找等。
三、有序顺序表的建立1. 定义结构体或类我们需要定义一个结构体或类,用于表示有序顺序表。
结构体或类中应包含元素存储的数组,以及记录当前元素个数和表长的变量。
2. 初始化在建立有序顺序表时,我们需要对其进行初始化。
可以通过动态内存分配来分配数组空间,并对其他变量进行初始化。
需要注意的是,数组的大小应该根据实际需要进行调整,以防止空间浪费。
3. 插入元素在有序顺序表中插入元素是一个常见的操作。
当插入元素时,我们需要保持顺序表的有序性。
可以通过比较元素大小的方式,找到合适的位置并将元素插入其中。
四、有序顺序表的基本操作1. 插入操作有序顺序表的插入操作是比较常见的操作之一。
当我们需要向顺序表中插入新元素时,我们首先需要找到合适的位置,然后将其插入其中。
2. 删除操作删除操作是有序顺序表中另一个重要的操作。
当我们需要删除某个元素时,我们可以通过查找元素的方式找到需要删除的元素,然后将其后的元素向前移动,从而达到删除的目的。
3. 查找操作有序顺序表中的查找操作也是常见的操作之一。
当我们需要查找某个元素时,可以通过顺序查找或二分查找的方式进行查找,以获取所需的元素。
五、个人观点和理解有序顺序表是C++编程中非常常见的数据结构之一。
它能够帮助我们高效地存储和操作数据,是程序中的重要工具。
在实际应用中,我们需要灵活地运用有序顺序表的建立和基本操作,以解决实际问题。
顺序表的定义及基本操作
printf("数据插入成功!\n");
}
else if(temp == 3)
DispList(h);
else if(temp == 4)
printf("该单链表的长度= %d\n",ListLength(h));
else if(temp == 5)
{
int N;
scanf("%d", &N);
if(N<1||N>ListLength(h))
}
printf("\n");
}
int GetElem(LinkList *L,int i,ElemType &e) //获取链表中的任意位置的元素。但是不能越界
{
int j=1;
LinkList *p=L->next;
while (j<i && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL)
}
if (p==NULL)//未找到第i-1个结点
{
printf("未找到第%d个节点!\n", (i-1));
return 0;
}
else//找到第i-1个结点*p
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s
s->data=e;
s->next=p->next;//将*s插入到*p之后
while(temp != 0)
{
printf("********************************************************************************");
《数据结构》实验指导书(C语言版)(浦江学院)
实验1: 顺序表的操作实验一、实验名称和性质二、实验目的1.掌握线性表的顺序存储结构的表示和实现方法。
2.掌握顺序表基本操作的算法实现。
3.了解顺序表的应用。
三、实验内容1.建立顺序表。
2.在顺序表上实现插入、删除和查找操作(验证性内容)。
3.删除有序顺序表中的重复元素(设计性内容)。
四、实验的软硬件环境要求硬件环境要求:PC机(单机)使用的软件名称、版本号:Windows环境下的VC++6.0五、知识准备前期要求熟练掌握了C语言的编程规则、方法和顺序表的基本操作算法。
六、验证性实验1.实验要求编程实现如下功能:(1)根据输入顺序表的长度n和各个数据元素值建立一个顺序表,并输出顺序表中各元素值,观察输入的内容与输出的内容是否一致。
(2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值。
(3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值。
(4)在顺序表中查找值为e的数据元素,如果查找成功,则显示“查找成功”和该元素在顺序表中的位置,否则显示“查找失败”。
2. 实验相关原理线性表的顺序存储结构称为顺序表,顺序表的存储结构描述为:#define MAXLEN 30 /*线性表的最大长度*/typedef struct{Elemtype elem[MAXLEN]; /*顺序表中存放元素的数组,其中elemtype为抽象数据类型,在程序具体实现时可以用任意类型代替*/int length; /*顺序表的长度,即元素个数*/}Sqlist; /*顺序表的类型*/【核心算法提示】(1)顺序表插入操作的基本步骤:要在顺序表中的第i个数据元素之前插入一个数据元素x,首先要判断插入位置i是否合法,假设线性表的表长为n,则i的合法值范围:1≤i ≤n+1,若是合法位置,就再判断顺序表是否满,如果满,则增加空间或结束操作,如果不满,则将第i个数据元素及其之后的所有数据元素都后移一个位置,此时第i个位置已经腾空,再将待插入的数据元素x插入到该位置上,最后将线性表的表长增加1。
顺序表的基础操作
顺序表是一种线性表的数据结构,它由一个数组和指向数组第一个元素的指针构成,支持线性表中的基本操作。
以下是顺序表的基础操作。
1. 初始化操作:初始化顺序表时需要给数组分配内存空间,并且确定顺序表的长度,可使用calloc 函数来动态分配内存空间,初始化值为0。
2. 插入操作:在顺序表中插入元素时,需要判断插入位置是否合法(在数组中的下标范围内),并将插入位置后的元素后移,将新元素插入。
3. 删除操作:删除顺序表中的元素时,需要判断删除位置是否合法,将被删除元素后面的元素前移,覆盖被删除元素,同时调整顺序表的长度。
4. 查找操作:查找顺序表中的元素时,可以通过循环遍历数组的元素来进行查找,也可以使用二分查找算法进行查询,从而提高效率。
5. 遍历操作:遍历顺序表时,通过循环遍历数组的元素,逐个访问顺序表中的每一个元素。
6. 获取长度操作:获取顺序表的长度时,直接返回顺序表的长度值即可。
7. 清空操作:清空顺序表时,需要将数组中所有元素清空,并将顺序表的长度设置为0。
8. 销毁操作:销毁顺序表时,需要释放动态分配的内存空间。
以上是顺序表的基本操作,它们是实现线性表的常用操作,对于线性表的数据结构学习非常重要。
数据结构实验报告 顺序表基本操作
四、实验步骤
一 1. 编 写 头 文 件 。 定 义 数 据 类 型 。 分 别 写 各 个 函 数 如 ListInsern_Sq , ListDelete_Sq,LocateElem 等函数。 2.编写主函数。 在主函数里构造空的线性表, 然后利用 ListInsert 函数使用户 初始化线性表。然后调用函数操作,操作结果用 PrintList_Sq 打印出线性表的内 容 3.运行程序,完整代码见下:
-4-
else { printf("输入位置有错! \n"); printf("-------------------------------------\n"); }/**/ printf("请输入你要删除的元素的位置:\n");//删除元素 scanf("%d",&i); if(ListDelete_Sq(La,i,e)) { printf("你删除的元素为: %d,删除元素后线性表为:\n",e); PrintList_Sq(La); printf("-------------------------------------\n"); } else { printf("输入位置有错! \n"); printf("-------------------------------------\n"); } printf("请输入你要查找的元素:\n");//查找元素 scanf("%d",&e); if(i=LocateElem_Sq(La,e,cmp)) { printf("你要查找的元素在第 %d 个位置。\n",i); printf("-------------------------------------\n"); } else { printf("找不到这个元素: \n"); printf("-------------------------------------\n"); } if(ClearList_Sq(La))//清空线性表 { printf("线性表已清空。 \n"); printf("--------------------------------------\n"); } else { printf("线性表清空出错。 \n"); printf("--------------------------------------\n"); } if(Destroy_Sq(La))//撤销线性表
- 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、直接插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已排序好的子文件中的适当位置,直到全部记录插入完成为止。