[关闭]
@Arbalest-Laevatain 2018-10-15T03:10:32.000000Z 字数 22443 阅读 918

Anyview 数据结构 第二章

数据结构


/******

1【题目】试写一算法,实现顺序栈的判空操作

  1. StackEmpty_Sq(SqStack S)。

顺序栈的类型定义为:

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. int top; // 栈顶元素的下一个位置,简称栈顶位标
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack; // 顺序栈

*******/

  1. Status StackEmpty_Sq(SqStack S)
  2. /* 对顺序栈S判空。 */
  3. /* 若S是空栈,则返回TRUE;否则返回FALSE */
  4. {
  5. if ( S.top == 0)
  6. return TRUE;
  7. return FALSE;
  8. }

/******

2【题目】试写一算法,实现顺序栈的取栈顶元素操作

  1. GetTop_Sq(SqStack S, ElemType &e)。

顺序栈的类型定义为:

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. int top; // 栈顶元素的下一个位置,简称栈顶位标
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack; // 顺序栈

*******/

  1. Status GetTop_Sq(SqStack S, ElemType &e)
  2. /* 取顺序栈S的栈顶元素到e,并返回OK; */
  3. /* 若失败,则返回ERROR。 */
  4. {
  5. if (S.top==0)
  6. return ERROR;
  7. e = S.elem[S.top-1];
  8. return OK;
  9. }

/******

3【题目】试写一算法,实现顺序栈的出栈操作

  1. Pop_Sq(SqStack &S, ElemType &e)。

顺序栈的类型定义为:

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. int top; // 栈顶元素的下一个位置,简称栈顶位标
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack; // 顺序栈

*******/

  1. Status Pop_Sq(SqStack &S, ElemType &e)
  2. /* 顺序栈S的栈顶元素出栈到e,并返回OK;*/
  3. /* 若失败,则返回ERROR。 */
  4. {
  5. if (S.top==0)
  6. return ERROR;
  7. e = S.elem[S.top-1];
  8. S.top-=1;
  9. return OK;
  10. }

/******

4 【题目】若顺序栈的类型重新定义如下。试编写算法,

构建初始容量和扩容增量分别为size和inc的空顺序栈S。

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. ElemType *top; // 栈顶元素的下一个位置
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack2;

*******/

  1. Status InitStack_Sq2(SqStack2 &S, int size, int inc)
  2. /* 构建初始容量和扩容增量分别为size和inc的空顺序栈S。*/
  3. /* 若成功,则返回OK;否则返回ERROR。 */
  4. {
  5. if (size>0 && inc>0)
  6. {
  7. S.size=size;
  8. S.increment=inc;
  9. S.top=size;
  10. return OK;
  11. }
  12. return ERROR;
  13. }

/******

5【题目】若顺序栈的类型重新定义如下。试编写算法,

实现顺序栈的判空操作。

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. ElemType *top; // 栈顶元素的下一个位置
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack2;

*******/

  1. Status StackEmpty_Sq2(SqStack2 S)
  2. /* 对顺序栈S判空。 */
  3. /* 若S是空栈,则返回TRUE;否则返回FALSE */
  4. {
  5. if (S.top==S.elem)
  6. return TRUE;
  7. return FALSE;
  8. }

/******

6【题目】若顺序栈的类型重新定义如下。试编写算法,

实现顺序栈的入栈操作。

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. ElemType *top; // 栈顶元素的下一个位置
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack2;

*******/

  1. Status Push_Sq2(SqStack2 &S, ElemType e)
  2. /* 若顺序栈S是满的,则扩容,若失败则返回ERROR。*/
  3. /* 将e压入S,返回OK。 */
  4. {
  5. if (S.top>=S.elem+S.size)
  6. {
  7. if (S.increment<=0)
  8. return ERROR;
  9. ElemType *p;
  10. p = (ElemType *) realloc (S.elem,(S.size+S.increment)*sizeof(ElemType));
  11. if (p==NULL)
  12. return ERROR;
  13. S.elem=p;
  14. S.top=S.elem+S.size;
  15. S.size+=S.increment;
  16. }
  17. *S.top=e;
  18. S.top++;
  19. return OK;
  20. }

/******

7 【题目】若顺序栈的类型重新定义如下。试编写算法,

实现顺序栈的出栈操作。

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. ElemType *top; // 栈顶元素的下一个位置
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack2;

*******/

  1. Status Pop_Sq2(SqStack2 &S, ElemType &e)
  2. /* 若顺序栈S是空的,则返回ERROR; */
  3. /* 否则将S的栈顶元素出栈到e,返回OK。*/
  4. {
  5. if (S.top==S.elem)
  6. return ERROR;
  7. e = *(S.top-1);
  8. S.top-=1;
  9. return OK;
  10. }

/******

8【题目】试写一算法,借助辅助栈,复制顺序栈S1得到S2。

顺序栈的类型定义为:

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. int top; // 栈顶元素的下一个位置,简称栈顶位标
  4. int size; // 当前分配的存储容量
  5. int increment; // 扩容时,增加的存储容量
  6. } SqStack; // 顺序栈

可调用顺序栈接口中下列函数:

  1. Status InitStack_Sq(SqStack &S, int size, int inc); // 初始化顺序栈S
  2. Status DestroyStack_Sq(SqStack &S); // 销毁顺序栈S
  3. Status StackEmpty_Sq(SqStack S); // 栈S判空,若空则返回TRUE,否则FALSE
  4. Status Push_Sq(SqStack &S, ElemType e); // 将元素e压入栈S
  5. Status Pop_Sq(SqStack &S, ElemType &e); // 栈S的栈顶元素出栈到e

*******/

  1. Status CopyStack_Sq(SqStack S1, SqStack &S2)
  2. /* 借助辅助栈,复制顺序栈S1得到S2。 */
  3. /* 若复制成功,则返回TRUE;否则FALSE。 */
  4. {
  5. ElemType e;
  6. SqStack S0;
  7. InitStack_Sq(S0, S1.size, S1.increment);
  8. InitStack_Sq(S2, S1.size, S1.increment);
  9. S0.top=0;
  10. S2.top=0;
  11. if (StackEmpty_Sq(S1)==TRUE )
  12. {
  13. return TRUE;
  14. }
  15. int i,l;
  16. l=S1.top;
  17. for (i=0;i<l;i++)
  18. {
  19. Pop_Sq(S1, e);
  20. Push_Sq(S0, e);
  21. }
  22. for (i=0;i<l;i++)
  23. {
  24. Pop_Sq(S0, e);
  25. Push_Sq(S2,e);
  26. }
  27. DestroyStack_Sq(S0);
  28. return OK;
  29. }

/******

9【题目】试写一算法,求循环队列的长度。

循环队列的类型定义为:

  1. typedef struct {
  2. ElemType *base; // 存储空间的基址
  3. int front; // 队头位标
  4. int rear; // 队尾位标,指示队尾元素的下一位置
  5. int maxSize; // 最大长度
  6. } SqQueue;

*******/

  1. int QueueLength_Sq(SqQueue Q)
  2. /* 返回队列Q中元素个数,即队列的长度。 */
  3. {
  4. int l = (Q.rear - Q.front + Q.maxSize) % Q.maxSize ;
  5. return l;
  6. }

/******

10【题目】如果希望循环队列中的元素都能得到利用,

则可设置一个标志域tag,并以tag值为0或1来区分尾
指针和头指针值相同时的队列状态是"空"还是"满"。
试编写与此结构相应的入队列和出队列的算法。
本题的循环队列CTagQueue的类型定义如下:

  1. typedef struct {
  2. ElemType elem[MAXQSIZE];
  3. int tag;
  4. int front;
  5. int rear;
  6. } CTagQueue;

******/

  1. Status EnCQueue(CTagQueue &Q, ElemType x)
  2. /* 将元素x加入队列Q,并返回OK;*/
  3. /* 若失败,则返回ERROR。 */
  4. {
  5. if (Q.tag == 1 && Q.front==Q.rear)
  6. return ERROR;
  7. Q.elem[Q.rear]=x;
  8. Q.rear=(Q.rear+1) % MAXQSIZE;
  9. return OK;
  10. }
  11. Status DeCQueue(CTagQueue &Q, ElemType &x)
  12. /* 将队列Q的队头元素退队到x,并返回OK;*/
  13. /* 若失败,则返回ERROR。 */
  14. {
  15. if (Q.tag == 0 && Q.front==Q.rear)
  16. return ERROR;
  17. x=Q.elem[Q.front];
  18. Q.front=(Q.front+1) % MAXQSIZE;
  19. return OK;
  20. }

/******

11【题目】假设将循环队列定义为:以域变量rear

和length分别指示循环队列中队尾元素的位置和内
含元素的个数。试给出此循环队列的队满条件,并
写出相应的入队列和出队列的算法(在出队列的算
法中要返回队头元素)。
本题的循环队列CLenQueue的类型定义如下:

  1. typedef struct {
  2. ElemType elem[MAXQSIZE];
  3. int length;
  4. int rear;
  5. } CLenQueue;

******/

  1. Status EnCQueue(CLenQueue &Q, ElemType x)
  2. /* 将元素x加入队列Q,并返回OK;*/
  3. /* 若失败,则返回ERROR。 */
  4. {
  5. if (Q.elem==NULL || Q.length>=MAXQSIZE)
  6. return ERROR;
  7. Q.rear = (Q.rear+1) % MAXQSIZE;
  8. Q.elem[Q.rear]=x;
  9. Q.length++;
  10. return OK;
  11. }
  12. Status DeCQueue(CLenQueue &Q, ElemType &x)
  13. /* 将队列Q的队头元素退队到x,并返回OK;*/
  14. /* 若失败,则返回ERROR。 */
  15. {
  16. if (Q.elem==NULL ||Q.length==0)
  17. return ERROR;
  18. if(Q.rear+1>=Q.length)
  19. x=Q.elem[Q.rear+1-Q.length];
  20. else
  21. x=Q.elem[MAXQSIZE-Q.length+Q.rear+1];
  22. //x = Q.elem[(Q.length-Q,rear + MAXQSIZE) % MAXQSIZE];
  23. --Q.length;
  24. return OK;
  25. }

12【题目】已知k阶斐波那契序列的定义为:

f0=0,  f1=0,  …,  fk-2=0,  fk-1=1;
fn=fn-1+fn-2+…+fn-k,  n=k,k+1,…

试利用循环队列编写求k阶斐波那契序列中第
n+1项fn的算法。

本题的循环队列的类型定义如下:

  1. typedef struct {
  2. ElemType *base; // 存储空间的基址
  3. int front; // 队头位标
  4. int rear; // 队尾位标,指示队尾元素的下一位置
  5. int maxSize; // 最大长度
  6. } SqQueue;
  7. **********/
  8. long Fib(int k, int n)
  9. /* 求k阶斐波那契序列的第n项fn
  10. 要求:必须使用循环队列
  11. */
  12. {
  13. long sum = 0;
  14. int i, j,m;
  15. SqQueue a;
  16. a.maxSize = k+1;
  17. //注意循环队列由于判空判满的问题所以有一个元素空间没有用
  18. a.base = (ElemType*)malloc(a.maxSize * sizeof(ElemType));
  19. a.front = 0;
  20. a.rear = 0;
  21. if (n < k - 1)
  22. {
  23. sum = 0;
  24. return sum;
  25. }
  26. else if (n == k-1)
  27. {
  28. sum = 1;
  29. return sum;
  30. }
  31. //初始化该队列对应的斐波那契数列
  32. do
  33. {
  34. a.base[a.rear] = 0;
  35. a.rear = (a.rear + 1) % a.maxSize;
  36. } while ((a.rear + 1) % a.maxSize != a.front);
  37. a.base[a.rear-1] = 1;
  38. cout << a.base[a.rear-1] << endl;
  39. cout << a.rear << endl;
  40. cout << a.front << endl;
  41. cout << endl;
  42. m = a.front;
  43. for (i = k-1; i < n; i++)
  44. {
  45. long v = 0;
  46. j = a.front;
  47. do
  48. {
  49. v += a.base[j];
  50. cout << "v:" << v << " " << "j:" << j << endl;
  51. j = (j + 1) % a.maxSize;
  52. } while ((j + 1) % a.maxSize != a.front);
  53. cout << endl;
  54. cout << "v:" << v << " "<< "i:" << i << endl;
  55. cout << "rear " << a.rear << endl;
  56. cout << endl;
  57. a.base[a.rear] = v;
  58. if ((a.rear + 1) % a.maxSize == a.front)
  59. {
  60. a.rear = a.front;
  61. }
  62. else
  63. a.rear = (a.rear + 1) % a.maxSize;
  64. a.front = (a.front + 1) % a.maxSize;
  65. }
  66. sum = 0;
  67. j = a.front;
  68. do
  69. {
  70. sum += a.base[j];
  71. cout << a.base[j] << " " << "j:" << j << endl;
  72. j = (j + 1) % a.maxSize;
  73. } while ((j + 1) % a.maxSize != a.front);
  74. return sum;
  75. }

/******

12【题目】设A=(a1,…,am)和B=(b1,…,bn)均为有序顺序表,

A'和B'分别为A和B中除去最大共同前缀后的子表(例如,
A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大
的共同前缀为(x,y,y,z), 在两表中除去最大共同前缀后
的子表分别为A'=(x,z)和B'=(y,x,x,z))。若A'=B'=空表,
则A=B;若A'=空表,而B'≠ 空表,或者两者均不为空表,
且A'的首元小于B'的首元,则AB。试写一个比
较A和B大小的算法。(注意:在算法中,不要破坏原表A
和B,也不一定先求得A'和B'才进行比较)。
顺序表类型定义如下:

  1. typedef struct {
  2. ElemType *elem;
  3. int length;
  4. int size;
  5. int increment;
  6. } SqList;

******/

  1. char Compare(SqList A, SqList B)
  2. /* 比较顺序表A和B, */
  3. /* 返回'<', 若A<B; */
  4. /* '=', 若A=B; */
  5. /* '>', 若A>B */
  6. {
  7. int i;
  8. if (A.elem[0]!=B.elem[0])
  9. {
  10. if (A.elem[0] < B.elem[0])
  11. return '<';
  12. else if (A.elem[0] > B.elem[0] )
  13. return '>';
  14. else if (A.length == B.length)
  15. return '=';
  16. }
  17. for (i=0;i<A.length;i++)
  18. {
  19. if (A.elem[i] == B.elem[i])
  20. continue;
  21. else
  22. break;
  23. }
  24. if (i == A.length)
  25. {
  26. if (i == B.length)
  27. return '=';
  28. else
  29. return '<';
  30. }
  31. else
  32. {
  33. if (i+1 == B.length)
  34. return '>';
  35. else if (A.length < B.length)
  36. return '<';
  37. else if (A.length > B.length)
  38. return '>';
  39. else if (A.elem[i+1] < B.elem[i+1])
  40. return '<';
  41. else
  42. return '>';
  43. }
  44. }

/******

13 【题目】试写一算法,实现顺序表的就地逆置,

即利用原表的存储空间将线性表(a1,a2,…,an)
逆置为(an,an-1,…,a1)。
顺序表类型定义如下:

  1. typedef struct {
  2. ElemType *elem;
  3. int length;
  4. int size;
  5. int increment;
  6. } SqList;
  7. **********/
  8. void Inverse(SqList &L)
  9. {
  10. for (i=0;i<L.length/2;i++)
  11. {
  12. ElemType t;
  13. t = L.elem[i];
  14. L.elem[i] = L.elem[L.length - i - 1];
  15. L.elem[L.length - i - 1] = t;
  16. }
  17. }

/******

14【题目】试对一元稀疏多项式Pn(x)采用存储量同多项式

项数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0
为给定值)。

一元稀疏多项式的顺序存储结构:

  1. typedef struct {
  2. int coef; // 系数
  3. int exp; // 指数
  4. } Term;
  5. typedef struct {
  6. Term *elem; // 存储空间基址
  7. int length; // 长度(项数)
  8. } Poly;
  9. **********/
  10. float Evaluate(Poly P, float x)
  11. /* P.elem[i].coef 存放ai, */
  12. /* P.elem[i].exp存放ei (i=1,2,...,m) */
  13. /* 本算法计算并返回多项式的值。不判别溢出。 */
  14. /* 入口时要求0≤e1<e2<...<em,算法内不对此再作验证 */
  15. {
  16. int i, j;
  17. float sum = 0;
  18. float t;
  19. for ( i = 0; i < P.length; i++)
  20. {
  21. t = x;
  22. if (P.elem[i].exp == 0)
  23. {
  24. t = 1.0;
  25. }
  26. else
  27. {
  28. for ( j = 1; j < P.elem[i].exp; j++)
  29. t *= x;
  30. }
  31. sum += (float)P.elem[i].coef*t;
  32. }
  33. return sum;
  34. }

测试代码

  1. typedef struct {
  2. int coef; // 系数
  3. int exp; // 指数
  4. } Term;
  5. typedef struct {
  6. Term *elem; // 存储空间基址
  7. int length; // 长度(项数)
  8. } Poly;
  9. float Evaluate(Poly P, float x)
  10. /* P.elem[i].coef 存放ai, */
  11. /* P.elem[i].exp存放ei (i=1,2,...,m) */
  12. /* 本算法计算并返回多项式的值。不判别溢出。 */
  13. /* 入口时要求0≤e1<e2<...<em,算法内不对此再作验证 */
  14. {
  15. int i, j;
  16. float sum = 0;
  17. float t;
  18. for ( i = 0; i < P.length; i++)
  19. {
  20. t = x;
  21. if (P.elem[i].exp == 0)
  22. {
  23. t = 1.0;
  24. }
  25. else
  26. {
  27. for ( j = 1; j < P.elem[i].exp; j++)
  28. t *= x;
  29. }
  30. sum += (float)P.elem[i].coef*t;
  31. }
  32. return sum;
  33. }
  34. int main()
  35. {
  36. Poly p;
  37. //Poly *a = (Poly*)malloc(sizeof(Poly));
  38. p.length = 3;
  39. p.elem = (Term*)malloc(p.length*sizeof(Term));
  40. for (int i = 0; i < p.length; i++)
  41. {
  42. p.elem[i].coef = i + 1;
  43. p.elem[i].exp = i;
  44. }
  45. double x = 0.01;
  46. float re = Evaluate(p,x);
  47. printf("%lf\n",re);
  48. printf("%lf\n", 1.0 + 2.0*x + 3.0*x*x);
  49. return 0;
  50. }

/******

15 【题目】假设有两个集合A和B分别用两个线性表LA和LB

表示(即:线性表中的数据元素即为集合中的成员),
试写一算法,求并集
顺序表类型定义如下

  1. typedef struct {
  2. ElemType *elem; // 存储空间的基址
  3. int length; // 当前长度
  4. int size; // 存储容量
  5. int increment; // 空间不够增加空间大小
  6. } SqList; // 顺序表
  7. //可调用顺序表的以下接口函数:
  8. Status InitList_Sq(SqList &L, int size, int inc); // 初始化顺序表L
  9. int ListLength_Sq(SqList L); // 返回顺序表L中元素个数
  10. Status GetElem_Sq(SqList L, int i, ElemType &e);
  11. // 用e返回顺序表L中第i个元素的值
  12. int Search_Sq(SqList L, ElemType e);
  13. // 在顺序表L顺序查找元素e,成功时返回该元素在表中第一次出现的位置,否则返回-1
  14. Status Append_Sq(SqList &L, ElemType e); // 在顺序表L表尾添加元素e
  15. **********/
  16. void Union(SqList &La, SqList Lb)
  17. {
  18. if (La.elem == NULL)
  19. if (Lb.elem == NULL)
  20. La.elem == NULL;
  21. else
  22. La.elem = Lb.elem;
  23. else
  24. {
  25. int la = ListLength_Sq(La);
  26. int lb = ListLength_Sq(Lb);
  27. int i,j;
  28. for (i = 1;i <= lb;i++)
  29. {
  30. GetElem_Sq(Lb,i,j);
  31. if (Search_Sq(La,j) != -1)
  32. continue;
  33. else
  34. {
  35. //if (La.length+1 == La.size)
  36. Append_Sq(La,j);
  37. }
  38. }
  39. }
  40. }

求出并集,要放到第一个表里!!

/******

16【题目】试写一算法,实现链栈的判空操作。

链栈的类型定义为:

  1. typedef struct LSNode {
  2. ElemType data; // 数据域
  3. struct LSNode *next; // 指针域
  4. } LSNode, *LStack; // 结点和链栈类型
  5. ***********/
  6. Status StackEmpty_L(LStack S)
  7. /* 对链栈S判空。若S是空栈,则返回TRUE;否则返回FALSE */
  8. {
  9. if (S == NULL)
  10. return TRUE;
  11. else
  12. return FALSE;
  13. }

/******

17 【题目】试写一算法,实现链栈的取栈顶元素操作。

链栈的类型定义为:

  1. typedef struct LSNode {
  2. ElemType data; // 数据域
  3. struct LSNode *next; // 指针域
  4. } LSNode, *LStack; // 结点和链栈类型
  5. ***********/
  6. Status GetTop_L(LStack S, ElemType &e)
  7. /* 取链栈S的栈顶元素到e,并返回OK; */
  8. /* 若S是空栈,则失败,返回ERROR。 */
  9. {
  10. if (S == NULL)
  11. return ERROR;
  12. else
  13. {
  14. e = S->deta;
  15. return OK;
  16. }
  17. }

/******

18 【题目】试写一算法,实现链队列的判空操作。

链队列的类型定义为:

  1. typedef struct LQNode {
  2. ElemType data;
  3. struct LQNode *next;
  4. } LQNode, *QueuePtr; // 结点和结点指针类型
  5. typedef struct {
  6. QueuePtr front; // 队头指针
  7. QueuePtr rear; // 队尾指针
  8. } LQueue; // 链队列类型

  1. Status QueueEmpty_LQ(LQueue Q)
  2. /* 判定链队列Q是否为空队列。 */
  3. /* 若Q是空队列,则返回TRUE,否则FALSE。*/
  4. {
  5. if (Q.front->next == Q.rear)
  6. return TRUE;
  7. else
  8. return FALSE;
  9. }

/******

19 【题目】试写一算法,实现链队列的求队列长度操作。

链队列的类型定义为:

  1. typedef struct LQNode {
  2. ElemType data;
  3. struct LQNode *next;
  4. } LQNode, *QueuePtr; // 结点和结点指针类型
  5. typedef struct {
  6. QueuePtr front; // 队头指针
  7. QueuePtr rear; // 队尾指针
  8. } LQueue; // 链队列类型
  9. ***********/
  10. int QueueLength_LQ(LQueue Q)
  11. /* 求链队列Q的长度并返回其值 */
  12. {
  13. int l = 0;
  14. QueuePtr p = Q.front;
  15. while(p->next != Q.rear)
  16. {
  17. l++;
  18. p = p->next;
  19. }
  20. return l;
  21. }

未知错误

/******

(做到这,存在问题)20【题目】(PE68) 假设以带头结点的循环链表表示队列,并且

只设一个指针指向队尾元素结点(注意不设头指针),
试编写相应的队列初始化、入队列和出队列的算法。
带头结点循环链队列CLQueue的类型定义为:

  1. typedef struct LQNode {
  2. ElemType data;
  3. struct LQNode *next;
  4. } LQNode, *CLQueue;
  5. **********/
  6. Status InitCLQueue(CLQueue &rear) // 初始化空队列
  7. {
  8. if (NULL == (rear = (CLQueue) malloc (sizeof(CLQueue))))
  9. return OVERFLOW;
  10. else
  11. {
  12. rear->next = NULL;
  13. //L->next = rear;
  14. return OK;
  15. }
  16. }
  17. Status EnCLQueue(CLQueue &rear, ElemType x) // 入队
  18. {
  19. CLQueue l,p;
  20. if (NULL == (l = (CLQueue) malloc (sizeof(CLQueue))))
  21. return OVERFLOW;
  22. l->data = e;
  23. p = rear;
  24. while (p->next != rear)
  25. {
  26. p = p->next;
  27. }
  28. l->next = p->next;
  29. p->next = l;
  30. return OK;
  31. }
  32. Status DeCLQueue(CLQueue &rear, ElemType &x) // 出队
  33. {
  34. CLQueue p = rear;
  35. if (rear->next == NULL)
  36. return ERROR;
  37. else
  38. {
  39. while (p->next != rear)
  40. p = p->next;
  41. x = rear->data;
  42. rear = rear->next;
  43. p->next = rear;
  44. return OK;
  45. }
  46. }

更正后代码

  1. Status EnCLQueue(CLQueue &rear, ElemType x) // 入队
  2. {
  3. CLQueue p;
  4. //q = rear->next;
  5. if (NULL == (p = (LQNode*) malloc (sizeof(LQNode))))
  6. return OVERFLOW;
  7. p->data = x;
  8. //printf("%c\n",x);
  9. //printf("\n");
  10. p->next = rear->next;
  11. rear->next = p;
  12. rear = p;
  13. //rear->next->data;
  14. return OK;
  15. }

注意:
在使用malloc函数来分派内存的时候,前面括号里是该类型的指针类型,后面括号才是该类型
(隔了一段时间就容易忘……2333……)

错误信息

  1. <第2次运行> 2018/10/12 8:29:49
  2. A$: InitCLQueue(rear) : OK Queue = (( ))
  3. E$: InitCLQueue(rear) : OK Queue = (( ))
  4. ===== Right =====
  5. Queue=( SHQ)
  6. A$: EnCLQueue(rear, 'M') = OK --> ( SHQM)
  7. A$: DeCLQueue(rear, e ) = OK --> ( HQ) e = 'S'
  8. E$: EnCLQueue(rear, 'M') = OK --> ( SH繫)
  9. E$: DeCLQueue(rear, e ) = OK --> ( HQ) e = 'S'
  10. ----- Error -----
  11. Queue=( CXMPVPWM)
  12. A$: EnCLQueue(rear, 'B') = OK --> ( CXMPVPWMB)
  13. A$: DeCLQueue(rear, e ) = OK --> ( XMPVPWM) e = 'C'
  14. E$: EnCLQueue(rear, 'B') = OK --> ( CXMPVPW旴)
  15. E$: DeCLQueue(rear, e ) = OK --> ( XMPVPWM) e = 'C'
  16. ----- Error -----
  17. Queue=( BOWQFLJUF)
  18. A$: EnCLQueue(rear, 'B') = OK --> ( BOWQFLJUFB)
  19. A$: DeCLQueue(rear, e ) = OK --> ( OWQFLJUF) e = 'B'
  20. E$: EnCLQueue(rear, 'B') = OK --> ( BOWQFLJUJB)
  21. E$: DeCLQueue(rear, e ) = OK --> ( OWQFLJUF) e = 'B'
  22. ----- Error -----
  23. Queue=( KCUVYBAC)
  24. A$: EnCLQueue(rear, 'M') = OK --> ( KCUVYBACM)
  25. A$: DeCLQueue(rear, e ) = OK --> ( CUVYBAC) e = 'K'
  26. E$: EnCLQueue(rear, 'M') = OK --> ( KCUVYBA鸐)
  27. E$: DeCLQueue(rear, e ) = OK --> ( CUVYBAC) e = 'K'
  28. ----- Error -----
  29. Queue=( )
  30. A$: EnCLQueue(rear, 'Z') = OK --> ( Z)
  31. A$: DeCLQueue(rear, e ) = ERROR --> ( )
  32. E$: EnCLQueue(rear, 'Z') = OK --> ( Z)
  33. E$: DeCLQueue(rear, e ) = ERROR --> ( )
  34. ===== Right =====
  35. Error:4 Right:2

在自己电脑的测试代码及数据

  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define ERROR 0
  8. #define OVERFLOW -1
  9. typedef int Status;
  10. #define ElemType char
  11. typedef struct LQNode {
  12. ElemType data;
  13. struct LQNode *next;
  14. } LQNode, *CLQueue;
  15. Status InitCLQueue(CLQueue &rear) // 初始化空队列
  16. {
  17. if (NULL == (rear = (CLQueue)malloc(sizeof(CLQueue))))
  18. return OVERFLOW;
  19. else
  20. {
  21. rear->next = rear;
  22. //L->next = rear;
  23. return OK;
  24. }
  25. }
  26. Status EnCLQueue(CLQueue &rear, ElemType x) // 入队
  27. {
  28. CLQueue p;
  29. if (NULL == (p = (CLQueue)malloc(sizeof(CLQueue))))
  30. return OVERFLOW;
  31. p->data = x;
  32. p->next = rear->next;
  33. rear->next = p;
  34. rear = p;
  35. return OK;
  36. }
  37. Status DeCLQueue(CLQueue &rear, ElemType &x) // 出队
  38. {
  39. CLQueue p = rear->next;
  40. CLQueue q = p->next;
  41. if (rear->next == rear)
  42. return ERROR;
  43. else
  44. {
  45. x = q->data;
  46. p->next = q->next;
  47. return OK;
  48. }
  49. }
  50. //定义一个打印函数
  51. void printCLquene(CLQueue rear)
  52. {
  53. CLQueue p = rear->next;
  54. p = p->next;
  55. while (p != rear->next)
  56. {
  57. printf("%c",p->data);
  58. p = p->next;
  59. }
  60. cout << endl;
  61. }
  62. //输入函数
  63. void input(CLQueue &rear,int n)
  64. {
  65. char c;
  66. CLQueue q,p;
  67. p = rear->next;
  68. for (int i = 0; i < n; i++)
  69. {
  70. cout << "输入data" << endl;
  71. cin >> c;
  72. q = (CLQueue)malloc(sizeof(CLQueue));
  73. q->data = c;
  74. rear->next = q;
  75. rear = q;
  76. rear->next = p;
  77. }
  78. }
  79. int main()
  80. {
  81. //定义一个循环列表
  82. CLQueue rear, p,q;
  83. ////初始化
  84. InitCLQueue(rear);
  85. input(rear, 3);
  86. printCLquene(rear);
  87. //入队操作
  88. ElemType e;
  89. e = 'M';
  90. EnCLQueue(rear,e);
  91. printCLquene(rear);
  92. return 0;
  93. }

/******

21 【题目】试写一算法,实现带头结点单链表的判空操作。

单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList; // 结点和结点指针类型
  5. ***********/
  6. Status ListEmpty_L(LinkList L)
  7. /* 判定带头结点单链表L是否为空链表。 */
  8. /* 若L是空链表,则返回TRUE,否则FALSE。*/
  9. {
  10. if (L->next == NULL)
  11. return TRUE;
  12. else
  13. return FALSE;
  14. }

/******

22 【题目】试写一算法,实现带头结点单链表的销毁操作。

单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList; // 结点和结点指针类型
  5. ***********/
  6. Status DestroyList_L(LinkList &L)
  7. /* 销毁带头结点单链表L,并返回OK。*/
  8. {
  9. LinkList p,q;
  10. LinkList a,b,c;
  11. p = L->next;
  12. if (p == NULL)
  13. {
  14. free(L);
  15. return OK;
  16. }
  17. while (p != NULL)
  18. {
  19. q = p;
  20. p = p->next;
  21. free(q);
  22. }
  23. free(L);
  24. return OK;
  25. }

/******

23 【题目】试写一算法,实现带头结点单链表的清空操作。

单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList; // 结点和结点指针类型
  5. ***********/
  6. Status ClearList_L(LinkList &L)
  7. /* 将带头结点单链表L置为空表,并返回OK。*/
  8. /* 若L不是带头结点单链表,则返回ERROR。 */
  9. {
  10. if (NULL == L)
  11. return ERROR;
  12. LinkList p,q;
  13. LinkList a,b,c;
  14. p = L->next;
  15. if (p == NULL)
  16. return OK;
  17. while (p != NULL)
  18. {
  19. q = p;
  20. p = p->next;
  21. free(q);
  22. }
  23. L->next = NULL;
  24. return OK;
  25. }

/******

24 【题目】试写一算法,实现带头结点单链表的求表长度操作。

单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList; // 结点和结点指针类型
  5. ***********/
  6. int ListLength_L(LinkList L)
  7. /* 求带头结点单链表L的长度,并返回长度值。*/
  8. /* 若L不是带头结点单链表,则返回-1。 */
  9. {
  10. if (NULL == L)
  11. return -1;
  12. LinkList p;
  13. p = L->next;
  14. int num = 0;
  15. while (p != NULL)
  16. {
  17. p = p->next;
  18. num++;
  19. }
  20. return num;
  21. }

/******

(存在问题) 25(PE82)【题目】试写一算法,在带头结点单链表L插入第i元素e。

带头结点单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList;
  5. **********/
  6. Status Insert_L(LinkList L, int i, ElemType e)
  7. /* 在带头结点单链表L插入第i元素e,并返回OK。*/
  8. /* 若参数不合理,则返回ERROR。 */
  9. {
  10. LinkList p = L;
  11. if (NULL == p || i <1)
  12. return ERROR;
  13. int num = 1;
  14. while (p->next != NULL && num<i)
  15. {
  16. p = p->next;
  17. num++;
  18. }
  19. if (num <i)
  20. return ERROR;
  21. LinkList m;
  22. m = (LinkList) malloc (sizeof(LNode));
  23. m->next = p->next;
  24. p->next = m;
  25. m->data = e;
  26. return OK;
  27. }

错误信息

  1. <第3次运行> 2018/10/12 9:23:42
  2. A$: L0 = ( )
  3. A$: Insert_L(L0, 0, '*') = ERROR L0 = ( )
  4. A$: Insert_L(L0, 1, '*') = OK L0 = ( *)
  5. A$: Insert_L(L0, 2, '*') = ERROR L0 = ( )
  6. E$: L0 = ( )
  7. E$: Insert_L(L0, 0, '*') = ERROR L0 = ( )
  8. E$: Insert_L(L0, 1, '*') = OK L0 = ( *)
  9. E$: Insert_L(L0, 2, '*') = ERROR L0 = ( )
  10. ===== Right =====
  11. A$: L1 = ( a)
  12. A$: Insert_L(L1, 0, '*') = ERROR L1 = ( a)
  13. A$: Insert_L(L1, 1, '*') = OK L1 = ( *a)
  14. A$: Insert_L(L1, 2, '*') = OK L1 = ( a*)
  15. A$: Insert_L(L1, 6, '*') = ERROR L1 = ( a)
  16. E$: L1 = ( a)
  17. E$: Insert_L(L1, 0, '*') = ERROR L1 = ( a)
  18. E$: Insert_L(L1, 1, '*') = OK L1 = ( *
  19. E$: Insert_L(L1, 2, '*') = OK L1 = (
  20. E$: Insert_L(L1, 6, '*') = ERROR L1 = ( a)
  21. ----- Error -----
  22. A$: L2 = ( ab)
  23. A$: Insert_L(L2, 0, '*') = ERROR L2 = ( ab)
  24. A$: Insert_L(L2, 1, '*') = OK L2 = ( *ab)
  25. A$: Insert_L(L2, 2, '*') = OK L2 = ( a*b)
  26. A$: Insert_L(L2, 3, '*') = OK L2 = ( ab*)
  27. A$: Insert_L(L2, 4, '*') = ERROR L2 = ( ab)
  28. E$: L2 = ( ab)
  29. E$: Insert_L(L2, 0, '*') = ERROR L2 = ( ab)
  30. E$: Insert_L(L2, 1, '*') = OK L2 = ( *a?
  31. E$: Insert_L(L2, 2, '*') = OK L2 = ( a*?
  32. E$: Insert_L(L2, 3, '*') = OK L2 = ( a
  33. E$: Insert_L(L2, 4, '*') = ERROR L2 = ( ab)
  34. ----- Error -----
  35. A$: L3 = ( abcdefg)
  36. A$: Insert_L(L3, 0, '*') = ERROR L3 = ( abcdefg)
  37. A$: Insert_L(L3, 1, '*') = OK L3 = ( *abcdefg)
  38. A$: Insert_L(L3, 2, '*') = OK L3 = ( a*bcdefg)
  39. A$: Insert_L(L3, 6, '*') = OK L3 = ( abcde*fg)
  40. A$: Insert_L(L3, 7, '*') = OK L3 = ( abcdef*g)
  41. A$: Insert_L(L3, 8, '*') = OK L3 = ( abcdefg*)
  42. A$: Insert_L(L3, 9, '*') = ERROR L3 = ( abcdefg)
  43. E$: L3 = ( abcdefg)
  44. E$: Insert_L(L3, 0, '*') = ERROR L3 = ( abcdefg)
  45. E$: Insert_L(L3, 1, '*') = OK L3 = ( *abcdef#)
  46. E$: Insert_L(L3, 2, '*') = OK L3 = ( a*bcdef)
  47. E$: Insert_L(L3, 6, '*') = OK L3 = ( abcde*f?
  48. E$: Insert_L(L3, 7, '*') = OK L3 = ( abcdef*?
  49. E$: Insert_L(L3, 8, '*') = OK L3 = ( abcdef
  50. E$: Insert_L(L3, 9, '*') = ERROR L3 = ( abcdefg)
  51. ----- Error -----
  52. Error:3 Right:1

测试代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define ERROR 0
  8. #define OVERFLOW -1
  9. typedef int Status;
  10. #define ElemType char
  11. typedef struct LNode {
  12. ElemType data;
  13. struct LNode *next;
  14. } LNode, *LinkList;
  15. Status Insert_L(LinkList L, int i, ElemType e)
  16. /* 在带头结点单链表L插入第i元素e,并返回OK。*/
  17. /* 若参数不合理,则返回ERROR。 */
  18. {
  19. LinkList p = L;
  20. if (NULL == p || i <1)
  21. return ERROR;
  22. int num = 1;
  23. while (p->next != NULL && num<i)
  24. {
  25. p = p->next;
  26. num++;
  27. }
  28. if (num <i)
  29. return ERROR;
  30. LinkList m;
  31. m = (LinkList)malloc(sizeof(LinkList));
  32. m->next = p->next;
  33. p->next = m;
  34. m->data = e;
  35. return OK;
  36. }
  37. //初始化带头结点的单链表函数
  38. void InitLinkList(LinkList &L)
  39. {
  40. LinkList q;
  41. char c[] = {"abcdefg"};
  42. q = L;
  43. //q->next = L->next;
  44. for (int i = 0; i < 7; i++)
  45. {
  46. LinkList p = (LinkList)malloc(sizeof(LinkList));
  47. p->data = c[i];
  48. p->next = q->next;
  49. q->next = p;
  50. q = q->next;
  51. }
  52. //L = q;
  53. }
  54. //定义打印函数
  55. void printLinkLIst(LinkList &L)
  56. {
  57. LinkList p;
  58. p = L->next;
  59. while (p != NULL)
  60. {
  61. cout << p->data;
  62. p = p->next;
  63. }
  64. cout << endl;
  65. }
  66. int main()
  67. {
  68. //定义一个带头结点的单链表
  69. //L3 = ( abcdefg)
  70. LinkList L = (LinkList)malloc(sizeof(LinkList));
  71. L->next = NULL;
  72. InitLinkList(L);
  73. printLinkLIst(L);
  74. Insert_L(L,2,'*');
  75. printLinkLIst(L);
  76. return 0;
  77. }

/******

(存在问题) 26(84)【题目】试写一算法,在带头结点单链表删除第i元素到e。

带头结点单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList;
  5. **********/
  6. Status Delete_L(LinkList L, int i, ElemType &e)
  7. /* 在带头结点单链表L删除第i元素到e,并返回OK。*/
  8. /* 若参数不合理,则返回ERROR。 */
  9. {
  10. LinkList p = L;
  11. LinkList q ;
  12. if (NULL == p || i <1)
  13. return ERROR;
  14. int num = 0;
  15. while (p->next != NULL && num<i)
  16. {
  17. q = p;
  18. p = p->next;
  19. num++;
  20. }
  21. if (i > num)
  22. return ERROR;
  23. LinkList m = p;
  24. e = m->data;
  25. q->next = m->next;
  26. //free(m);
  27. return OK;
  28. }

错误信息

  1. <第2次运行> 2018/10/12 10:10:09
  2. A$: L0 = ( )
  3. A$: Delete_L(L0, 0, e) = ERROR L0 = ( )
  4. A$: Delete_L(L0, 1, e) = ERROR L0 = ( )
  5. A$: Delete_L(L0, 2, e) = ERROR L0 = ( )
  6. E$: L0 = ( )
  7. E$: Delete_L(L0, 0, e) = ERROR L0 = ( )
  8. E$: Delete_L(L0, 1, e) = ERROR L0 = ( )
  9. E$: Delete_L(L0, 2, e) = ERROR L0 = ( )
  10. ===== Right =====
  11. A$: L1 = ( a)
  12. A$: Delete_L(L1, 0, e) = ERROR L1 = ( a)
  13. A$: Delete_L(L1, 1, e) = OK L1 = ( ) e = 'a'
  14. A$: Delete_L(L1, 2, e) = ERROR L1 = ( a)
  15. A$: Delete_L(L1, 3, e) = ERROR L1 = ( a)
  16. E$: L1 = ( a)
  17. E$: Delete_L(L1, 0, e) = ERROR L1 = ( a)
  18. E$: Delete_L(L1, 1, e) = ERROR L1 = ( a)
  19. E$: Delete_L(L1, 2, e) = ERROR L1 = ( a)
  20. E$: Delete_L(L1, 3, e) = ERROR L1 = ( a)
  21. ----- Error -----
  22. A$: L2 = ( ab)
  23. A$: Delete_L(L2, 0, e) = ERROR L2 = ( ab)
  24. A$: Delete_L(L2, 1, e) = OK L2 = ( b) e = 'a'
  25. A$: Delete_L(L2, 2, e) = OK L2 = ( a) e = 'b'
  26. A$: Delete_L(L2, 3, e) = ERROR L2 = ( ab)
  27. A$: Delete_L(L2, 8, e) = ERROR L2 = ( ab)
  28. E$: L2 = ( ab)
  29. E$: Delete_L(L2, 0, e) = ERROR L2 = ( ab)
  30. E$: Delete_L(L2, 1, e) = ERROR L2 = ( ab)
  31. E$: Delete_L(L2, 2, e) = ERROR L2 = ( ab)
  32. E$: Delete_L(L2, 3, e) = ERROR L2 = ( ab)
  33. E$: Delete_L(L2, 8, e) = ERROR L2 = ( ab)
  34. ----- Error -----
  35. A$: L3 = ( abcdefg)
  36. A$: Delete_L(L3, 0, e) = ERROR L3 = ( abcdefg)
  37. A$: Delete_L(L3, 1, e) = OK L3 = ( bcdefg) e = 'a'
  38. A$: Delete_L(L3, 2, e) = OK L3 = ( acdefg) e = 'b'
  39. A$: Delete_L(L3, 5, e) = OK L3 = ( abcdfg) e = 'e'
  40. A$: Delete_L(L3, 7, e) = OK L3 = ( abcdef) e = 'g'
  41. A$: Delete_L(L3, 8, e) = ERROR L3 = ( abcdefg)
  42. A$: Delete_L(L3, 9, e) = ERROR L3 = ( abcdefg)
  43. E$: L3 = ( abcdefg)
  44. E$: Delete_L(L3, 0, e) = ERROR L3 = ( abcdefg)
  45. E$: Delete_L(L3, 1, e) = ERROR L3 = ( abcdefg)
  46. E$: Delete_L(L3, 2, e) = ERROR L3 = ( abcdefg)
  47. E$: Delete_L(L3, 5, e) = ERROR L3 = ( abcdefg)
  48. E$: Delete_L(L3, 7, e) = ERROR L3 = ( abcdefg)
  49. E$: Delete_L(L3, 8, e) = ERROR L3 = ( abcdefg)
  50. E$: Delete_L(L3, 9, e) = ERROR L3 = ( abcdefg)
  51. ----- Error -----
  52. Error:3 Right:1

测试代码

/******

27 【题目】试写一算法,在带头结点单链表的第i元素起的

所有元素从链表移除,并构成一个带头结点的新链表。
带头结点单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList;
  5. **********/
  6. Status Split_L(LinkList L, LinkList &Li, int i)
  7. /* 在带头结点单链表L的第i元素起的所有元素 */
  8. /* 移除,并构成带头结点链表Li,返回OK。 */
  9. /* 若参数不合理,则Li为NULL,返回ERROR。 */
  10. {
  11. LinkList p = L;
  12. LinkList q;
  13. q = (LinkList) malloc (sizeof(LNode));
  14. Li = (LinkList) malloc (sizeof(LNode));
  15. if (NULL == p || i <1)
  16. {
  17. Li = NULL;
  18. return ERROR;
  19. }
  20. int num = 0;
  21. while (p->next != NULL && num<i)
  22. {
  23. q = p;
  24. p = p->next;
  25. num++;
  26. }
  27. if (i > num)
  28. {
  29. Li = NULL;
  30. return ERROR;
  31. }
  32. LinkList p1 = p;
  33. LinkList p2 = Li;
  34. while (p1 != NULL)
  35. {
  36. q->next = p1->next;
  37. p1->next = p2->next;
  38. p2->next = p1;
  39. p1 = q->next;
  40. p2 = p2->next;
  41. }
  42. return OK;
  43. }

注意!!别忘了出错的时候把Li置为空

测试代码

  1. #include <iostream>
  2. using namespace std;
  3. #define TRUE 1
  4. #define FALSE 0
  5. #define OK 1
  6. #define ERROR 0
  7. #define OVERFLOW -1
  8. typedef int Status;
  9. #define ElemType char
  10. typedef struct LNode {
  11. ElemType data;
  12. struct LNode *next;
  13. } LNode, *LinkList;
  14. Status Split_L(LinkList L, LinkList &Li, int i)
  15. /* 在带头结点单链表L的第i元素起的所有元素 */
  16. /* 移除,并构成带头结点链表Li,返回OK。 */
  17. /* 若参数不合理,则Li为NULL,返回ERROR。 */
  18. {
  19. LinkList p = L->next;
  20. LinkList q = L;
  21. //q = (LinkList)malloc(sizeof(LinkList));
  22. if (NULL == p || i <1)
  23. return ERROR;
  24. int num = 0;
  25. while (p != NULL && num<i)
  26. {
  27. if (num != 0)
  28. {
  29. p = p->next;
  30. q = q->next;
  31. }
  32. num++;
  33. }
  34. if (i > num)
  35. return ERROR;
  36. LinkList p1 = p;
  37. LinkList p2 = Li;
  38. while (p1 != NULL)
  39. {
  40. q->next = p1->next;
  41. p1->next = p2->next;
  42. p2->next = p1;
  43. p1 = q->next;
  44. p2 = p2->next;
  45. }
  46. return OK;
  47. }
  48. //初始化带头结点的单链表函数
  49. void InitLinkList(LinkList &L)
  50. {
  51. LinkList q;
  52. char c[] = { "abcdefg" };
  53. q = L;
  54. //q->next = L->next;
  55. for (int i = 0; i < 7; i++)
  56. {
  57. LinkList p = (LinkList)malloc(sizeof(LinkList));
  58. p->data = c[i];
  59. p->next = q->next;
  60. q->next = p;
  61. q = q->next;
  62. }
  63. //L = q;
  64. }
  65. //定义打印函数
  66. void printLinkLIst(LinkList &L)
  67. {
  68. LinkList p;
  69. p = L->next;
  70. while (p != NULL)
  71. {
  72. cout << p->data;
  73. p = p->next;
  74. }
  75. cout <<endl;
  76. }
  77. int main()
  78. {
  79. //L3 = (abcdefg)
  80. LinkList L = (LinkList)malloc(sizeof(LinkList));
  81. L->next = NULL;
  82. LinkList Li = (LinkList)malloc(sizeof(LinkList));
  83. Li->next = NULL;
  84. InitLinkList(L);
  85. printLinkLIst(L);
  86. int re = Split_L(L, Li, 2);
  87. printLinkLIst(L);
  88. printLinkLIst(Li);
  89. cout << re << endl;
  90. return 0;
  91. }

/******

28【题目】试写一算法,在带头结点单链表删除第i元素

起的所有元素。
带头结点单链表的类型定义为:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList;
  5. **********/
  6. Status Cut_L(LinkList L, int i)
  7. /* 在带头结点单链表L删除第i元素起的所有元素,并返回OK。*/
  8. /* 若参数不合理,则返回ERROR。 */
  9. {
  10. LinkList p = L;
  11. if (NULL == p || i <1)
  12. return ERROR;
  13. int num = 0;
  14. while (p->next != NULL )
  15. {
  16. p = p->next;
  17. num++;
  18. }
  19. if (i > num)
  20. return ERROR;
  21. LinkList m = L;
  22. for(int k=0;k<i-1;k++)
  23. m = m->next;
  24. m->next=null;
  25. return OK;
  26. }

/******

29【题目】试写一算法,删除带头结点单链表中所有值

为x的元素,并释放被删结点空间。
单链表类型定义如下:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList;
  5. **********/
  6. Status DeleteX_L(LinkList L, ElemType x)
  7. /* 删除带头结点单链表L中所有值为x的元素, */
  8. /* 并释放被删结点空间,返回实际删除的元素个数。*/
  9. {
  10. LinkList p = L;
  11. if (NULL == p->next)
  12. return ERROR;
  13. int num = 0;
  14. LinkList m;
  15. while (p != NULL)
  16. {
  17. m = p;
  18. if (m->next->data == x)
  19. {
  20. m = m->next;
  21. p->next = m->next;
  22. free(m);
  23. num++;
  24. }
  25. p = p->next;
  26. }
  27. return num;
  28. }

30【题目】试写一算法,删除带头结点单链表中所有值

小于x的元素,并释放被删结点空间。
单链表类型定义如下:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList;
  5. ******/
  6. Status DeleteSome_L(LinkList L, ElemType x)
  7. /* 删除带头结点单链表L中所有值小于x的元素, */
  8. /* 并释放被删结点空间,返回实际删除的元素个数。*/
  9. {
  10. LinkList p = L;
  11. if (NULL == p->next)
  12. return ERROR;
  13. int num = 0,flag;
  14. LinkList m;
  15. while (p->next != NULL)
  16. {
  17. flag = 0;
  18. if (p->next->data < x)
  19. {
  20. m = p->next;
  21. p->next = m->next;
  22. free(m);
  23. num++;
  24. flag = 1;
  25. }
  26. if (!flag)
  27. p = p->next;
  28. }
  29. return num;
  30. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注