收藏 分销(赏)

数据结构与算法习题及答案.doc

上传人:天**** 文档编号:4482188 上传时间:2024-09-24 格式:DOC 页数:49 大小:1.37MB 下载积分:12 金币
下载 相关 举报
数据结构与算法习题及答案.doc_第1页
第1页 / 共49页
数据结构与算法习题及答案.doc_第2页
第2页 / 共49页


点击查看更多>>
资源描述
第1章  绪论 习题 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 2.试举一个数据结构得例子,叙述其逻辑结构与存储结构两方面得含义与相互关系。 3。简述逻辑结构得四种基本关系并画出它们得关系图. 4。存储结构由哪两种基本得存储方法实现? 5。选择题 (1)在数据结构中,从逻辑上可以把数据结构分成(   )。 A.动态结构与静态结构   B.紧凑结构与非紧凑结构 C.线性结构与非线性结构 D。内部结构与外部结构 (2)与数据元素本身得形式、内容、相对位置、个数无关得就是数据得(  ). A.存储结构    B。存储实现 C.逻辑结构      D.运算实现 (3)通常要求同一逻辑结构中得所有数据元素具有相同得特性,这意味着(   ).   A。数据具有同一特点 B。不仅数据元素所包含得数据项得个数要相同,而且对应数据项得类型要一致 C.每个数据元素都一样 D.数据元素所包含得数据项得个数要相等 (4)以下说法正确得就是( ). A.数据元素就是数据得最小单位 B.数据项就是数据得基本单位 C.数据结构就是带有结构得各数据项得集合 D。一些表面上很不相同得数据可以有相同得逻辑结构 (5)以下与数据得存储结构无关得术语就是(   ). A。顺序队列     B、 链表       C、 有序表     D、 链栈 (6)以下数据结构中,( )就是非线性数据结构 A。树      B。字符串     C。队        D.栈 6.试分析下面各程序段得时间复杂度。 (1)x=90; y=100;  while(y〉0) if(x〉100)  {x=x-10;y—-;} else x++; (2)for (i=0; i<n; i++) for (j=0; j<m; j++) a[i][j]=0; (3)s=0;   for i=0; i〈n; i++) for(j=0; j<n; j++)    s+=B[i][j]; sum=s; (4)i=1;   while(i<=n)     i=i*3; (5)x=0; for(i=1; i<n; i++)   for (j=1; j<=n-i; j++) x++; (6)x=n; //n>1 y=0; while(x≥(y+1)* (y+1))   y++; (1)O(1) (2)O(m*n) (3)O(n2) (4)O(log3n) (5)因为x++共执行了n-1+n—2+……+1= n(n-1)/2,所以执行时间为O(n2) (6)O() 第2章 线性表 1.选择题 (1)一个向量第一个元素得存储地址就是100,每个元素得长度为2,则第5个元素得地址就是( )。 A.110    B.108   C.100    D。120 (2)在n个结点得顺序表中,算法得时间复杂度就是O(1)得操作就是( )。 A.访问第i个结点(1≤i≤n)与求第i个结点得直接前驱(2≤i≤n)  B。在第i个结点后插入一个新结点(1≤i≤n) C.删除第i个结点(1≤i≤n) D.将n个结点从小到大排序 (3) 向一个有127个元素得顺序表中插入一个新元素并保持原来顺序不变,平均要移动  得元素个数为( )。 A.8     B。63。5        C.63    D。7 (4)链接存储得存储结构所占存储空间( )。 A。分两部分,一部分存放结点值,另一部分存放表示结点间关系得指针 B.只有一部分,存放结点值 C.只有一部分,存储表示结点间关系得指针 D。分两部分,一部分存放结点值,另一部分存放结点所占单元数 (5)线性表若采用链式存储结构时,要求内存中可用存储单元得地址(  ). A.必须就是连续得      B.部分地址必须就是连续得 C。一定就是不连续得    D。连续或不连续都可以 (6)线性表L在(   )情况下适用于使用链式结构实现。 A.需经常修改L中得结点值   B.需不断对L进行删除插入 C。L中含有大量得结点         D.L中结点结构复杂 (7)单链表得存储密度( )。 A.大于1     B.等于1 C.小于1  D.不能确定 (8)将两个各有n个元素得有序表归并成一个有序表,其最少得比较次数就是( )。 A。n          B。2n-1  C。2n      D。n—1 (9)在一个长度为n得顺序表中,在第i个元素(1≤i≤n+1)之前插入一个新元素时须向后移动( )个元素。 A。n-i    B.n—i+1 C.n-i—1 D。i (10) 线性表L=(a1,a2,……an),下列说法正确得就是(   )。 A。每个元素都有一个直接前驱与一个直接后继 B。线性表中至少有一个元素 C.表中诸元素得排列必须就是由小到大或由大到小 D。除第一个与最后一个元素外,其余每个元素都有一个且仅有一个直接前驱与直接后继。 (11) 若指定有n个元素得向量,则建立一个有序单链表得时间复杂性得量级就是( )。 A.O(1)       B.O(n)  C。O(n2)      D.O(nlog2n) (12) 以下说法错误得就是( )。 A.求表长、定位这两种运算在采用顺序存储结构时实现得效率不比采用链式存储结构时实现得效率低 B。顺序存储得线性表可以随机存取 C。由于顺序存储要求连续得存储区域,所以在存储管理上不够灵活 D.线性表得链式存储结构优于顺序存储结构 (13) 在单链表中,要将s所指结点插入到p所指结点之后,其语句应为(   )。 A.s->next=p+1; p—>next=s; B。(*p)、next=s; (*s)、next=(*p)、next; C.s—>next=p->next; p—>next=s—>next; D.s->next=p-〉next; p->next=s; (14) 在双向链表存储结构中,删除p所指得结点时须修改指针(   )。 A。p—>next-〉prior=p-〉prior; p-〉prior—>next=p—>next; B.p—〉next=p—>next—〉next; p—〉next—〉prior=p; C.p—>prior->next=p; p—>prior=p—〉prior—>prior; D。p-〉prior=p->next->next; p—〉next=p->prior->prior; (15) 在双向循环链表中,在p指针所指得结点后插入q所指向得新结点,其修改指针得操作就是(   ). A.p-〉next=q; q->prior=p; p-〉next->prior=q; q->next=q; B。p->next=q; p->next->prior=q; q-〉prior=p; q-〉next=p->next; C。q—〉prior=p; q->next=p->next; p->next-〉prior=q; p->next=q; D。q-〉prior=p; q->next=p—〉next; p-〉next=q; p->next—〉prior=q; 2.算法设计题 (1)将两个递增得有序链表合并为一个递增得有序链表。要求结果链表仍使用原来两个链表得存储空间, 不另外占用其它得存储空间.表中不允许有重复得数据。 void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ pa=La-〉next; pb=Lb-〉next;   Lc=pc=La;      //用La得头结点作为Lc得头结点  while(pa && pb){    if(pa->data〈pb->data){ pc->next=pa;pc=pa;pa=pa—〉next;}     else if(pa->data〉pb-〉data) {pc—〉next=pb; pc=pb; pb=pb—〉next;}   else {// 相等时取La得元素,删除Lb得元素     pc->next=pa;pc=pa;pa=pa—〉next;        q=pb->next;delete pb ;pb =q;}  }   pc-〉next=pa?pa:pb;   //插入剩余段   delete Lb;       //释放Lb得头结点}   (2)将两个非递减得有序链表合并为一个非递增得有序链表。要求结果链表仍使用原来两个链表得存储空间, 不另外占用其它得存储空间。表中允许有重复得数据。 void union(LinkList& La, LinkList& Lb, LinkList& Lc, ) { pa = La->next;  pb = Lb->next;      // 初始化   Lc=pc=La; //用La得头结点作为Lc得头结点   Lc—>next = NULL; while ( pa || pb ) {    if ( !pa ) { q = pb; pb = pb-〉next; }      else if ( !pb ) { q = pa;  pa = pa-〉next; }  else if (pa->data 〈= pb—>data )  { q = pa;  pa = pa->next; }    else  { q = pb; pb = pb-〉next; } q—>next = Lc—〉next; Lc—>next = q; // 插入 }   delete Lb;      //释放Lb得头结点}   (3)已知两个链表A与B分别表示两个集合,其元素递增排列。请设计算法求出A与B得交集,并存放于A链表中. void Mix(LinkList& La, LinkList& Lb, LinkList& Lc, ) { pa=la—〉next;pb=lb-〉next;∥设工作指针pa与pb; Lc=pc=La; //用La得头结点作为Lc得头结点 while(pa&&pb)  if(pa-〉data==pb—>data)∥交集并入结果表中.    { pc—〉next=pa;pc=pa;pa=pa—>next; u=pb;pb=pb—〉next; delete u;}  else if(pa->data〈pb-〉data) {u=pa;pa=pa->next; delete u;} else {u=pb; pb=pb—>next; delete u;} while(pa){ u=pa; pa=pa—〉next; delete u;}∥ 释放结点空间 while(pb) {u=pb; pb=pb—〉next; delete u;}∥释放结点空间 pc->next=null;∥置链表尾标记。 delete Lb;   ∥注: 本算法中也可对B表不作释放空间得处理 (4)已知两个链表A与B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A与B 得差集(即仅由在A中出现而不在B中出现得元素所构成得集合),并以同样得形式存储,同时返回该集合得元素个数。 void Difference(LinkedList  A,B,*n) ∥A与B均就是带头结点得递增有序得单链表,分别存储了一个集合,本算法求两集合得差集,存储于单链表A中,*n就是结果集合中元素个数,调用时为0 {p=A->next;     ∥p与q分别就是链表A与B得工作指针。 q=B->next; pre=A;      ∥pre为A中p所指结点得前驱结点得指针。 while(p!=null && q!=null) if(p—>data<q-〉data){pre=p;p=p->next;*n++;} ∥ A链表中当前结点指针后移。 else if(p—〉data>q—〉data)q=q->next; ∥B链表中当前结点指针后移。 else {pre-〉next=p-〉next;     ∥处理A,B中元素值相同得结点,应删除。 u=p; p=p->next; delete u;} ∥删除结点 (5)设计算法将一个带头结点得单链表A分解为两个具有相同结构得链表B、C,其中B表得结点为A表中值小于零得结点,而C表得结点为A表中值大于零得结点(链表A得元素类型为整型,要求B、C表利用A表得结点)。 (6)设计一个算法,通过一趟遍历在单链表中确定值最大得结点。 ElemType Max (LinkList L ){ if(L->next==NULL) return NULL; ﻩpmax=L—>next; //假定第一个结点中数据具有最大值 p=L—〉next—>next; ﻩwhile(p != NULL ){//如果下一个结点存在 ﻩﻩif(p—>data 〉 pmax—>data) pmax=p; ﻩﻩp=p-〉next; ﻩ} ﻩreturn pmax->data; (7)设计一个算法,通过遍历一趟,将链表中所有结点得链接方向逆转,仍利用原表得存储空间。 void  inverse(LinkList &L) {   // 逆置带头结点得单链表 L p=L—>next; L->next=NULL;  while ( p) {        q=p->next;   // q指向*p得后继 p—>next=L-〉next;     L->next=p;     // *p插入在头结点之后   p = q; } } (8)设计一个算法,删除递增有序链表中值大于mink且小于maxk得所有元素(mink与maxk就是给定得两个参数,其值可以与表中得元素相同,也可以不同 )。 void delete(LinkList &L, int mink, int maxk) {   p=L->next; //首元结点  while (p && p->data<=mink)   { pre=p;  p=p-〉next; } //查找第一个值〉mink得结点  if (p) {  while (p && p-〉data〈maxk)  p=p—〉next;             // 查找第一个值 ≥maxk 得结点      q=pre-〉next;   pre—>next=p;  // 修改指针  while (q!=p)     { s=q->next; delete q; q=s; } // 释放结点空间   }//if } (9)已知p指向双向循环链表中得一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向得结点与它得前缀结点得顺序。 知道双向循环链表中得一个结点,与前驱交换涉及到四个结点(p结点,前驱结点,前驱得前驱结点,后继结点)六条链。 void  Exchange(LinkedList p) ∥p就是双向循环链表中得一个结点,本算法将p所指结点与其前驱结点交换。 {q=p-〉llink; q—>llink-〉rlink=p;   ∥p得前驱得前驱之后继为p p->llink=q->llink; ∥p得前驱指向其前驱得前驱。  q->rlink=p->rlink;  ∥p得前驱得后继为p得后继。  q->llink=p;     ∥p与其前驱交换  p->rlink->llink=q; ∥p得后继得前驱指向原p得前驱 p-〉rlink=q;     ∥p得后继指向其原来得前驱 }∥算法exchange结束。 (10)已知长度为n得线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)得算法,该算法删除线性表中所有值为item得数据元素。 [题目分析] 在顺序存储得线性表上删除元素,通常要涉及到一系列元素得移动(删第i个元素,第i+1至第n个元素要依次前移)。本题要求删除线性表中所有值为item得数据元素,并未要求元素间得相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item得数据元素时,直接将右端元素左移至值为item得数据元素位置。 void  Delete(ElemType A[ ],int n) ∥A就是有n个元素得一维数组,本算法删除A中所有值为item得元素. {i=1;j=n;∥设置数组低、高端指针(下标)。 while(i<j)   {while(i<j && A[i]!=item)i++;     ∥若值不为item,左移指针。    if(i<j)while(i<j && A[j]==item)j--;∥若右端元素值为item,指针左移     if(i<j)A[i++]=A[j--];   } [算法讨论] 因元素只扫描一趟,算法时间复杂度为O(n).删除元素未使用其它辅助空间,最后线性表中得元素个数就是j。 第3章  栈与队列 习题 1。选择题 (1)若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在( )种情况。 A.5,4,3,2,1  B。2,1,5,4,3  C。4,3,1,2,5   D.2,3,5,4,1 (2)若已知一个栈得入栈序列就是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为( ).    A。i          B。n—i       C。n-i+1       D.不确定 (3)数组Q[n]用来表示一个循环队列,f为当前队列头元素得前一位置,r为队尾元素得位置,假定队列中元素得个数小于n,计算队列中元素个数得公式为(  )。 A。r-f      B。(n+f-r)%n   C.n+r-f    D.(n+r—f)%n (4)链式栈结点为:(data,link),top指向栈顶、若想摘除栈顶结点,并将删除结点得值保存到x中,则应执行操作(  )。 A。x=top—>data;top=top—>link; B.top=top->link;x=top—>link;   C.x=top;top=top—>link; ﻩ  D.x=top->link; (5)设有一个递归算法如下         int fact(int n) {  //n大于等于0              if(n<=0) return 1;              else return n*fact(n-1);        } 则计算fact(n)需要调用该函数得次数为(  )。  A. n+1          B. n—1            C. n         D. n+2 (6)栈在 ( )中有所应用. A.递归调用   B.函数调用   C.表达式求值   D.前三个选项都有 (7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区.主机将要输出得数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据.该缓冲区得逻辑结构应该就是(  )。 A.队列   B。栈   C。 线性表         D。有序表 (8)设栈S与队列Q得初始状态为空,元素e1、e2、e3、e4、e5与e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队得序列就是e2、e4、e3、e6、e5与e1,则栈S得容量至少应该就是( ). A.2          B.3       C.4       D. 6 (9)在一个具有n个单元得顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top得变化为( )。  A.top不变   B。top=0  C.top—-      D.top++ (10)设计一个判别表达式中左,右括号就是否配对出现得算法,采用( )数据结构最佳。 A.线性表得顺序存储结构         B。队列 C、 线性表得链式存储结构       D、 栈 (11)用链接方式存储得队列,在进行删除运算时( )。 A、 仅修改头指针      B、 仅修改尾指针 C、 头、尾指针都要修改             D、 头、尾指针可能都要修改 (12)循环队列存储在数组A[0、、m]中,则入队时得操作为( )。 A、 rear=rear+1          B、 rear=(rear+1)%(m—1) C、 rear=(rear+1)%m  D、 rear=(rear+1)%(m+1) (13)最大容量为n得循环队列,队尾指针就是rear,队头就是front,则队空得条件就是( ). A、 (rear+1)%n==front      B、 rear==front                 C.rear+1==front         D、 (rear—l)%n==front (14)栈与队列得共同点就是( )。 A、 都就是先进先出     B、 都就是先进后出   C、 只允许在端点处插入与删除元素 D、 没有共同点 (15)一个递归算法必须包括( )。 A、 递归部分                B、 终止条件与递归部分 C、 迭代部分            D、 终止条件与迭代部分 (2)回文就是指正读反读均相同得字符序列,如“abba”与“abdba"均就是回文,但“good”不就是回文。试写一个算法判定给定得字符向量就是否为回文。(提示:将一半字符入栈)  根据提示,算法可设计为:ﻫ //以下为顺序栈得存储结构定义ﻫ #define StackSize 100 //假定预分配得栈空间最多为100个元素ﻫ typedef char DataType;//假定栈元素得数据类型为字符  typedef struct{ﻫ  DataType data[StackSize];ﻫ  int top;ﻫ }SeqStack; ﻫﻫ int IsHuiwen( char *t)ﻫ  {//判断t字符向量就是否为回文,若就是,返回1,否则返回0 SeqStack s;    int i , len;   char temp;    InitStack( &s);   len=strlen(t); //求向量长度    for ( i=0; i<len/2; i++)//将一半字符入栈    Push( &s, t[i]);    while( !EmptyStack( &s))ﻫ   {// 每弹出一个字符与相应字符比较     temp=Pop (&s);     if( temp!=S[i])  return 0 ;// 不等则返回0      else i++;   }     return 1 ; // 比较完毕均相等则返回 1ﻫ  } (3)设从键盘输入一整数得序列:a1, a2, a3,…,an,试编写算法实现:用栈结构存储输入得整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常情况(入栈满等)给出相应得信息。 #define maxsize 栈空间容量   void InOutS(int s[maxsize]) //s就是元素为整数得栈,本算法进行入栈与退栈操作。  {int top=0;       //top为栈顶指针,定义top=0时为栈空。   for(i=1; i<=n; i++)    //n个整数序列作处理。    {scanf(“%d”,&x);   //从键盘读入整数序列。 if(x!=-1)        // 读入得整数不等于-1时入栈。   if(top==maxsize—1){printf(“栈满\n”);exit(0);}else s[++top]=x; //x入栈。   else //读入得整数等于-1时退栈。     {if(top==0){printf(“栈空\n”);exit(0);} else printf(“出栈元素就是%d\n”,s[top-—]);}} }//算法结束。 (4)从键盘上输入一个后缀表达式,试编写算法计算表达式得值.规定:逆波兰表达式得长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、—、*、/四种运算。例如:234 34+2*$。 [题目分析]逆波兰表达式(即后缀表达式)求值规则如下:设立运算数栈OPND,对表达式从左到右扫描(读入),当表达式中扫描到数时,压入OPND栈。当扫描到运算符时,从OPND退出两个数,进行相应运算,结果再压入OPND栈。这个过程一直进行到读出表达式结束符$,这时OPND栈中只有一个数,就就是结果。 float expr( ) //从键盘输入逆波兰表达式,以‘$’表示输入结束,本算法求逆波兰式表达式得值。 {float OPND[30];  // OPND就是操作数栈.  init(OPND);    //两栈初始化。 float num=0、0;  //数字初始化。  scanf (“%c”,&x);//x就是字符型变量。 while(x!=’$’)   {switch   {case‘0’<=x<='9’:while((x〉=’0’&&x〈=’9')||x==’、’)  //拼数                  if(x!=’、’)  //处理整数 {num=num*10+(ord(x)—ord(‘0’)); scanf(“%c",&x);}       else     //处理小数部分。                  {scale=10、0; scanf(“%c”,&x);                  while(x>=’0’&&x<=’9’)                {num=num+(ord(x)-ord(‘0')/scale;               scale=scale*10; scanf(“%c",&x); }         }//else                push(OPND,num); num=0、0;//数压入栈,下个数初始化     case x=‘ ’:break;  //遇空格,继续读下一个字符.     case x=‘+':push(OPND,pop(OPND)+pop(OPND));break; case x=‘—’:x1=pop(OPND);x2=pop(OPND);push(OPND,x2-x1);break;   case x=‘*':push(OPND,pop(OPND)*pop(OPND));break;     case x=‘/’:x1=pop(OPND);x2=pop(OPND);push(OPND,x2/x1);break;   default:   //其它符号不作处理。 }//结束switch   scanf(“%c",&x);//读入表达式中下一个字符。   }//结束while(x!=‘$’)   printf(“后缀表达式得值为%f”,pop(OPND)); }//算法结束. [算法讨论]假设输入得后缀表达式就是正确得,未作错误检查。算法中拼数部分就是核心。若遇到大于等于‘0’且小于等于‘9'得字符,认为就是数。这种字符得序号减去字符‘0'得序号得出数。对于整数,每读入一个数字字符,前面得到得部分数要乘上10再加新读入得数得到新得部分数.当读到小数点,认为数得整数部分已完,要接着处理小数部分.小数部分得数要除以10(或10得幂数)变成十分位,百分位,千分位数等等,与前面部分数相加。在拼数过程中,若遇非数字字符,表示数已拼完,将数压入栈中,并且将变量num恢复为0,准备下一个数。这时对新读入得字符进入‘+’、‘—’、‘*'、‘/'及空格得判断,因此在结束处理数字字符得case后,不能加入break语句。 (5)假设以I与O分别表示入栈与出栈操作。栈得初态与终态均为空,入栈与出栈得操作序列可表示为仅由I与O组成得序列,称可以操作得序列为合法序列,否则称为非法序列。 ①下面所示得序列中哪些就是合法得?   A、 IOIIOIOO B、 IOOIOIIO     C、 IIIOIOIO  D、 IIIOOIOO ②通过对①得分析,写出一个算法,判定所给得操作序列就是否合法。若合法,返回true,否则返回false(假定被判定得操作序列已存入一维数组中)。 ①A与D就是合法序列,B与C 就是非法序列. ②设被判定得操作序列已存入一维数组A中。    int Judge(char A[])    //判断字符数组A中得输入输出序列就是否就是合法序列。如就是,返回true,否则返回false.      {i=0;        //i为下标。      j=k=0;   //j与k分别为I与字母O得得个数。 while(A[i]!=‘\0') //当未到字符数组尾就作。     {switch(A[i])        {case‘I’: j++; break; //入栈次数增1。          case‘O’: k++; if(k>j){printf(“序列非法\n”);exit(0);}         } i++; //不论A[i]就是‘I'或‘O',指针i均后移。}       if(j!=k) {printf(“序列非法\n”);return(false);}    else {printf(“序列合法\n”);return(true);}   }//算法结束。   [算法讨论]在入栈出栈序列(即由‘I’与‘O’组成得字符串)得任一位置,入栈次数(‘I’得个数)都必须大于等于出栈次数(即‘O’得个数),否则视作非法序列,立即给出信息,退出算法。整个序列(即读到字符数组中字符串得结束标记‘\0’),入栈次数必须等于出栈次数(题目中要求栈得初态与终态都为空),否则视为非法序列. (6)假设以带头结点得循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应得置空队、判队空 、入队与出队等算法。  算法如下: //先定义链队结构:  typedef struct queuenode{    Datatype data; struct queuenode *next;ﻫ  }QueueNode; //以上就是结点类型得定义ﻫ typedef struct{ queuenode *rear;ﻫ  }LinkQueue; //只设一个指向队尾元素得指针ﻫﻫ (1)置空队ﻫ  void InitQueue( LinkQueue *Q)ﻫ  { //置空队:就就是使头结点成为队尾元素ﻫ   QueueNode *s;ﻫ   Q->rear = Q-〉rear—〉next;//将队尾指针指向头结点 while (Q—〉rear!=Q->rear-〉next)//当队列非空,将队中元素逐个出队ﻫ     {s=Q->rear->next;ﻫ    Q->rear—〉next=s-〉next;ﻫ      free(s);ﻫ    }//回收结点空间   }ﻫ (2)判队空 ﻫ int EmptyQueue( LinkQueue *Q)ﻫ   { //判队空   //当头结点得next指针指向自己时为空队ﻫ   return Q->rear—〉next—>next==Q->rear->next;   }ﻫﻫ (3)入队   void EnQueue( LinkQueue *Q, Datatype x)   { //入队     //也就就是在尾结点处插入元素ﻫ    QueueNode *p=(QueueNode *) malloc (sizeof(QueueNode));//申请新结点ﻫ   p-〉data=x; p->next=Q->rear-〉next;//初始化新结点并链入    Q—rear—>next=p; ﻫ    Q->rear=p;//将尾指针移至新结点ﻫ   } ﻫ (4)出队ﻫ Datatype DeQueue( LinkQueue *Q)ﻫ   {//出队,把头结点之后得元素摘下ﻫ Datatype t;ﻫ  QueueNode *p;ﻫ   if(EmptyQueue( Q ))ﻫ      Error("Queue underflow");ﻫ  p=Q-〉rear—〉next-〉next; //p指向将要摘下得结点   x=p-〉data; //保存结点中数据     if (p==Q->rear)ﻫ  {//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点     Q-〉rear = Q->rear
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服