1. #include<stdio.h>
    2. #include<malloc.h>
    3. typedef struct node //定义链栈结点
    4. {
    5. int data; //这里以整型数据为例
    6. struct node *next; //指针类型,存放下一个结点地址
    7. } NODE;
    8. NODE *crea_linkstack() //建立链栈
    9. {
    10. NODE *top, *p; //定义栈顶指针top
    11. int a, n;
    12. top = NULL;
    13. printf("\nInput number of push linkstack : ");
    14. scanf("%d", &n); //入链栈的元素个数
    15. if (n > 0) //若n<=0,建立空栈
    16. {
    17. printf("Input %d elements of push linkstack : ", n);
    18. while (n > 0) {
    19. scanf("%d", &a); //输入新元素
    20. p = (NODE *) malloc(sizeof(NODE));
    21. p->data = a;
    22. p->next = top;
    23. top = p;
    24. n--;
    25. }
    26. }
    27. return (top); //返回栈顶指针
    28. }
    29. NODE *pushstack(NODE *top, int x) //进栈操作
    30. {
    31. NODE *p;
    32. p = (NODE *) malloc(sizeof(NODE));
    33. p->data = x; //将要插入的数据x存储到结点p的数据域中
    34. p->next = top; //将p插入链表头部,即链栈顶部
    35. top = p;
    36. return (top);
    37. }
    38. void print(NODE *top) //输出链栈中各元素
    39. {
    40. NODE *p;
    41. p = top;
    42. if (p != NULL) {
    43. printf("Output the linkstack : ");
    44. while (p != NULL) {
    45. printf("%3d", p->data);
    46. p = p->next;
    47. }
    48. } else
    49. printf("\nThe stack is empty!!!");
    50. }
    51. main() //主程序
    52. {
    53. int y; //将入栈的元素
    54. NODE *a;
    55. a = crea_linkstack(); //建立链栈
    56. print(a); //输出整个链栈
    57. printf("\nPush a element to linkstack : ");
    58. scanf("%d", &y); //输入进栈元素y
    59. a = pushstack(a, y); //y进栈
    60. print(a); //输出整个链栈
    61. }

    编写一个程序,输入 n(由用户输入)个 10 以内的数,每输入 i(0≤i≤9),就把它插入到第 i 号队列中。最后把 10 个队中非空队列,按队列号从小到大的顺序串接成一条链,并输出该链的所有元素。
    解答:建立一个队头指针数组 quh 和队尾指针数组 qut,quh[i]和 qut[i]表示 i 号(0≤i≤9)队列的队头和队尾,先将它们所有元素置为 NULL。对于输入的 x,采用尾插法将其链到 x号队列中。然后按 0~9 编号的顺序把这些队列中的结点构成一个不带头结点的单链表,其首结点指针为 head。最后输出单链表 head 的所有结点值并释放所有结点。

    1. #include <stdio.h>
    2. #include <malloc.h>
    3. #define MAXQNode 10 //队列的个数
    4. typedef struct node {
    5. int data;
    6. struct node *next;
    7. } QNode;
    8. void Insert(QNode *quh[], QNode *qut[], int x) //将 x 插入到相应队列中
    9. {
    10. QNode *s;
    11. s = (QNode *) malloc(sizeof(QNode)); //创建一个结点 s s->data=x; s->next=NULL;
    12. if (quh[x] == NULL) //x 号队列为空队时
    13. {
    14. quh[x] = s;
    15. qut[x] = s;
    16. } else //x 号队列不空队时
    17. {
    18. qut[x]->next = s; //将 s 结点链到 qut[x]所指结点之后
    19. qut[x] = s; //让 qut[x]仍指向尾结点
    20. }
    21. }
    22. void Create(QNode *quh[], QNode *qut[]) //根据用户输入创建队列
    23. {
    24. int n, x, i;
    25. printf("n:");
    26. scanf("%d", &n);
    27. for (i = 0; i < n; i++) {
    28. do {
    29. printf("输入第%d 个数:", i + 1);
    30. scanf("%d", &x);
    31. } while (x < 0 || x > 10);
    32. Insert(quh, qut, x);
    33. }
    34. }
    35. void DestroyList(QNode *head) //释放单链表
    36. {
    37. QNode *pre = head, *p = pre->next;
    38. while (p != NULL) {
    39. free(pre);
    40. pre = p;
    41. p = p->next;
    42. }
    43. free(pre);
    44. }
    45. void DispList(QNode *&head) //输出单链表的所有结点值
    46. {
    47. printf("\n 输出所有元素:");
    48. while (head != NULL) {
    49. printf("%d ", head->data);
    50. head = head->next;
    51. }
    52. printf("\n");
    53. }
    54. QNode *Link(QNode *quh[], QNode *qut[]) //将非空队列链接起来并输出
    55. {
    56. QNode *head = NULL, *tail; //总链表的首结点指针和尾结点指针
    57. int i;
    58. for (i = 0; i < MAXQNode; i++) //扫描所有队列
    59. if (quh[i] != NULL) //i 号队列不空
    60. {
    61. if (head == NULL) //若 i 号队列为第一个非空队列
    62. {
    63. head = quh[i];
    64. tail = qut[i];
    65. } else //若 i 号队列不是第一个非空队列
    66. {
    67. tail->next = quh[i];
    68. tail = qut[i];
    69. }
    70. }
    71. tail->next = NULL;
    72. return head;
    73. }
    74. int main() {
    75. int i;
    76. QNode *head;
    77. QNode *quh[MAXQNode], *qut[MAXQNode]; //各队列的队头 quh 和队尾指针 qut
    78. for (i = 0; i < MAXQNode; i++)
    79. quh[i] = qut[i] = NULL; //置初值空
    80. Create(quh, qut); //建立队列
    81. head = Link(quh, qut); //链接各队列产生单链表
    82. DispList(head); //输出单链表
    83. DestroyList(head); //销毁单链表
    84. return 1;
    85. }

    环形队列?采用什么方法实现
    当用数组表示队列时,把数组看成是一个环形的,即令数组中第一个元素紧跟在最末一个单元之后,就形成一个环形队列。环形队列解决了非环形队列中出现的“假溢出”现象。
    通常采用逻辑上求余数的方法来实现环形队列,假设数组的大小为 n,当元素下标 i 增 1 时,采用 i=(i+1)%n 来实现。

    环形队列一定优于非环形队列吗?什么情况下使用非环形队列?
    队列主要是用于保存中间数据,而且保存的数据满足先产生先处理的特点。非环形队列可能存在数据假溢出,即队列中还有空间,可是队满的条件却成立了,为此改为环形队列,这样克服了假溢出。但并不能说环形队列一定优于非环形队列,因为环形队列中出队元素的空间可能被后来进队的元素覆盖,如果算法要求在队列操作结束后利用进队的所有元素实现某种功能,这样环形队列就不适合了,这种情况下需要使用非环形队列,例如利用非环形队列求解迷宫路径就是这种情况。