<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>C&#43;&#43; 学习示例 on chinese</title>
    <link>https://www.xiexianbin.cn/cpp/demo/index.html</link>
    <description>Recent content in C&#43;&#43; 学习示例 on chinese</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 01 Apr 2012 16:30:41 +0800</lastBuildDate>
    
	<atom:link href="https://www.xiexianbin.cn/cpp/demo/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>顺序表的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-04-01-sequence-table/index.html</link>
      <pubDate>Sun, 01 Apr 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-04-01-sequence-table/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;顺序表的基本操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;顺序表的基本操作&#34;&gt;顺序表的基本操作&lt;/h2&gt;
&lt;p&gt;编写一个完整的程序，实现顺序表的建立、插入、删除、输出等基本运算。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立一个顺序表，含有n个数据元素。&lt;/li&gt;
&lt;li&gt;输出顺序表及顺序表的长度。&lt;/li&gt;
&lt;li&gt;在顺序表中删除值为x的结点或者删除给定位置i的结点。&lt;/li&gt;
&lt;li&gt;将顺序表就地逆置，即利用原表的存储空间将线性表（a1,a2,&amp;hellip;,an）逆置为（an,an-1,&amp;hellip;,a1）。&lt;/li&gt;
&lt;li&gt;将顺序表按升序排序。&lt;/li&gt;
&lt;li&gt;设顺序表中的数据元素递增有序，将x插入到顺序表的适当位置上，以保持该表的有序性。&lt;/li&gt;
&lt;li&gt;将两个顺序有序表A和B合并为一个有序表C。&lt;/li&gt;
&lt;li&gt;在主函数中设计一个简单的菜单，分别测试上述算法。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;程序&#34;&gt;程序&lt;/h2&gt;
&lt;div class=&#34;code-block-wrapper code-collapsible&#34; data-language=&#34;&#34;&gt;
  &lt;div class=&#34;code-block-header&#34;&gt;
    &lt;svg
      class=&#34;code-icon&#34;
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;14&#34;
      height=&#34;14&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2.5&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;16 18 22 12 16 6&#34;&gt;&lt;/polyline&gt;
      &lt;polyline points=&#34;8 6 2 12 8 18&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
    &lt;span class=&#34;code-language&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;button class=&#34;code-copy-btn&#34; title=&#39;复制代码&#39; aria-label=&#39;复制代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;
      &lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;button class=&#34;code-expand-btn&#34; title=&#39;折叠代码&#39; aria-label=&#39;折叠代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;18 15 12 9 6 15&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;div class=&#34;code-content-wrapper&#34;&gt;
    &lt;div class=&#34;code-block-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0
typedef int ElemType;
typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
} SqList;
int cmp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}

//创建一个空表
int InitList(SqList &amp;amp;L)
{
    L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //分配空间

    if (!L.elem)
        return OVERFLOW;
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}
//在创建的空表中插入数据
int ListInsert(SqList &amp;amp;L, int i, ElemType e)
{
    ElemType* newbase;
//ElemType* q;
    if (i &amp;lt; 0 ||
            i &amp;gt; L.length + 1)
        return ERROR;
    if (L.length &amp;gt;= L.listsize) //当前空间已满，增加新空间

    {
        newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));

        if (!newbase)
            return
                OVERFLOW;
        L.elem = newbase;
        L.listsize += LISTINCREMENT;

    }

    L.elem[i] = e;
//printf(&amp;#34;%d &amp;#34;,L.elem[i]);
    L.length++;
    return OK;
}
//删除位置为i的节点
int ListDelete(SqList &amp;amp;L, int i)
{
    ElemType* p;
    ElemType* q;
    if (i &amp;lt; 0 ||
            i &amp;gt; L.length)
        return ERROR;
    p = &amp;amp;(L.elem[i - 1]);
//e=*p;
    q = L.elem + L.length - 1;
    for (++p; p &amp;lt;= q; p++)
        *(p - 1) = *p;
    L.length--;
    return OK;
}
//在顺序表中删除数据x
int DeleteX(SqList &amp;amp;L, int x)
{
    ElemType* p;
    int i;
    for (i = 0; i &amp;lt; L.length; i++)
        if (L.elem[i] == x)
        {
            break;
        }
    p = &amp;amp;L.elem[i];

//free(p);
    for (int
            j = i; j &amp;lt; L.length - 1; j++)
    {
        L.elem[j] = L.elem[j + 1];

    }
    L.length--;
    return OK;
}
//反转顺序表
int TurnArrond(SqList &amp;amp;L)//翻转顺序表
{
    ElemType* p;
    ElemType* q;
    int t;
    p = &amp;amp;(L.elem[0]);
    q = L.elem + L.length - 1;
    for (p; p &amp;lt; q; p++, q--)
    {
        t = *q;
        *q = *p;
        *p = t;
    }
    return OK;
}
//升序排列顺序表
int ABC(SqList &amp;amp;L)
{
    int a[10000];
    int i;
    for (i = 0; i &amp;lt; L.length; i++)
        a[i] = L.elem[i];
    qsort(a, L.length, sizeof(a[0]), cmp);

    for (i = 0; i &amp;lt; L.length; i++)
        L.elem[i] = a[i];
    return OK;
}
//把顺序表升序排列后插入元素e
int ListInsertABC(SqList &amp;amp;L, ElemType e)
{
    ElemType* newbase;
    int i, j;
    if (L.length + 1 &amp;gt;= L.listsize) //当前空间已满，增加新空间

    {
        newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));

        if (!newbase)
            return
                OVERFLOW;
        L.elem = newbase;
        L.listsize += LISTINCREMENT;

    }

    for (i = 0; i &amp;lt; L.length; i++)
        if (e &amp;lt; L.elem[i])

            break;

    for (j = L.length; j &amp;gt; i; j--)

    {
        L.elem[j] = L.elem[j - 1];

    }
    L.length++;
    L.elem[j] = e;
//printf(&amp;#34;%d
    &amp;#34;,L.elem[i]);
    return OK;
}
//合并顺序表L，L1为L2
int MergeList(SqList L, SqList L1, SqList &amp;amp;L2)
{
    ElemType* pa;
    ElemType* pb;
    ElemType* pc;
    ElemType* pa_last;
    ElemType* pb_last;
    pa = L.elem;
    pb = L1.elem;
// L2.elem=pc;
    L2.listsize = L.listsize + L1.listsize;
    pc = L.elem = (ElemType*)malloc(L2.listsize *
                                    sizeof(ElemType));

    pa_last = L.elem + L.length - 1;
    pb_last = L1.elem + L1.length - 1;
    while (pa &amp;lt;= pa_last &amp;amp;&amp;amp; pb &amp;lt;= pb_last)
    {
        if (*pa &amp;lt;= *pb)

            *pc++ = *pa++;

        else
            *pc++ = *pb++;

    }
    while (pa &amp;lt;= pa_last)
        *pc++ = *pa++;
    while (pb &amp;lt;= pb_last)
        *pc++ = *pb++;
    for (int
            i = 0; i &amp;lt; L2.length; i++)
        printf(&amp;#34;%d &amp;#34;, L2.elem[i]);
    return OK;
}
//打印菜单
void printScreen()
{
//printf(&amp;#34;1.建立一个顺序表，含有n个数据元素。\n&amp;#34;);
    printf(&amp;#34;1.输出顺序表L1及其长度\n&amp;#34;);
    printf(&amp;#34;2.删除给定位置i的结点\n&amp;#34;);
    printf(&amp;#34;3.在顺序表中删除值为x的结点\n&amp;#34;);
    printf(&amp;#34;4.逆置顺序表\n&amp;#34;);
    printf(&amp;#34;5.将顺序表按升序排序\n&amp;#34;);
    printf(&amp;#34;6.设顺序表中的数据元素递增有序，将x插入到顺序表的适当位置上，以保持该表的有序性\n&amp;#34;);

    printf(&amp;#34;7.将两个顺序有序表L和L1合并为一个有序表L2\n&amp;#34;);
    printf(&amp;#34;0.退出操作系统。\n&amp;#34;);
    printf(&amp;#34;请输入需要的操作序号：&amp;#34;);
}
//输出顺序表L
void printSqList(SqList &amp;amp;L)
{
    int i;
    for (i = 0; i &amp;lt; L.length; i++)
        printf(&amp;#34;%d &amp;#34;, L.elem[i]);
    printf(&amp;#34;\n&amp;#34;);
}
int main()
{
    SqList L, L1, L2;
    InitList(L);
    InitList(L1);
    InitList(L2);
    int n, e, muse, i, x;
    bool flag;
//建立第一个的顺序表
    printf(&amp;#34;请输入第一个数据表的长度：&amp;#34;);
    scanf(&amp;#34;%d&amp;#34;, &amp;amp;n);
    printf(&amp;#34;请以次输入长度为%d的顺序表：&amp;#34;, n);
    for (i = 0; i &amp;lt; n; i++)
    {
        scanf(&amp;#34;%d&amp;#34;, &amp;amp;e);

        ListInsert(L, i, e); //依次在第i个位置插入顺序表

    }
    printf(&amp;#34;第一个顺序表的次序为：&amp;#34;);
    printSqList(L);

//建立第二个顺序表
    printf(&amp;#34;建立第二个顺序表，请输入要第二个建立数据表的长度：&amp;#34;);
    scanf(&amp;#34;%d&amp;#34;, &amp;amp;n);
    printf(&amp;#34;请以次输入长度为%d的顺序表：&amp;#34;, n);
    for (i = 0; i &amp;lt; n; i++)
    {
        scanf(&amp;#34;%d&amp;#34;, &amp;amp;e);

        ListInsert(L1, i, e); //依次在第i个位置插入顺序表

    }
    printf(&amp;#34;第二个顺序表的次序为：&amp;#34;);
    printSqList(L1);

//打印菜单
    printScreen();
    scanf(&amp;#34;%d&amp;#34;, &amp;amp;muse);
    flag = true;
    while (1)
    {
        switch (muse)
        {
        case 0:
            flag = false;

            break;
        case 1:
            printf(&amp;#34;顺序表的长度为：&amp;#34;);

            printf(&amp;#34;%d\n&amp;#34;, L.length);

            break;
        case 2:
            printf(&amp;#34;请输入要删除的节点：&amp;#34;);

            scanf(&amp;#34;%d&amp;#34;, &amp;amp;i); //删除顺序表的节点

            if (ListDelete(L, i))

            {
                printf(&amp;#34;删除成功！\n&amp;#34;);

                printSqList(L);

            }
            else
                printf(&amp;#34;删除失败！\n&amp;#34;);

            break;
        case 3:
            printf(&amp;#34;请输入要删除的节点x的值：&amp;#34;);

            scanf(&amp;#34;%d&amp;#34;, &amp;amp;x);

            if (DeleteX(L, x))

            {
                printf(&amp;#34;删除成功！\n顺序表为：&amp;#34;);

                printSqList(L);

            }
            else
                printf(&amp;#34;删除失败！\n&amp;#34;);

            break;
        case 4:
            //逆序顺序表
            if (TurnArrond(L))

            {
                printf(&amp;#34;逆序成功！\n&amp;#34;);

                printf(&amp;#34;顺序表的次序为：&amp;#34;);

                printSqList(L);

            }
            else
                printf(&amp;#34;逆序失败！\n&amp;#34;);

            break;
        case 5:
            //顺序表升序排列

            if (ABC(L))

            {
                printf(&amp;#34;顺序表升序排列成功！\n&amp;#34;);

                printf(&amp;#34;顺序表的次序为：&amp;#34;);

                printSqList(L);

            }
            else
                printf(&amp;#34;顺序表升序排列失败！\n&amp;#34;);


            printf(&amp;#34;请输入要插入的数据：&amp;#34;);

            scanf(&amp;#34;%d&amp;#34;, &amp;amp;e);

            if (ListInsertABC(L, e))

            {
                printf(&amp;#34;顺序插入成功！\n&amp;#34;);

                printf(&amp;#34;顺序表的次序为：&amp;#34;);

                printSqList(L);

            }
            else
                printf(&amp;#34;顺序插入失败！\n&amp;#34;);

            break;
        case 6:
            ABC(L);
            printf(&amp;#34;请输入要插入的数字x的值：&amp;#34;);

            scanf(&amp;#34;%d&amp;#34;, &amp;amp;x);

            if (ListInsertABC(L, x))

            {
                printf(&amp;#34;操作成功！\n&amp;#34;);

                printf(&amp;#34;顺序表的次序为：&amp;#34;);

                printSqList(L);

            }
            else
                printf(&amp;#34;操作失败！\n&amp;#34;);
            break;
        case 7:
            if (MergeList(L, L1, L2))

            {
                printf(&amp;#34;顺序表L，L1合并成功!\n&amp;#34;);

                //printf(&amp;#34;顺序表的次序为：&amp;#34;);

                //printSqList(L2);

            }
            else
                printf(&amp;#34;顺序表合并失败！\n&amp;#34;);

            break;
        default:
            break;
        }
        if (!flag)
            break;
        printf(&amp;#34;\n请输入你要的下一步操作序号：&amp;#34;);

        scanf(&amp;#34;%d&amp;#34;, &amp;amp;muse);

    }

    if (L.elem)
        free(L.elem);
    if (L1.elem)
        free(L1.elem);
    if (L2.elem)
        free(L2.elem);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>链表</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-04-07-sequence-table-2/index.html</link>
      <pubDate>Sat, 07 Apr 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-04-07-sequence-table-2/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;链表源码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;源码&#34;&gt;源码&lt;/h2&gt;
&lt;div class=&#34;code-block-wrapper code-collapsible&#34; data-language=&#34;&#34;&gt;
  &lt;div class=&#34;code-block-header&#34;&gt;
    &lt;svg
      class=&#34;code-icon&#34;
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;14&#34;
      height=&#34;14&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2.5&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;16 18 22 12 16 6&#34;&gt;&lt;/polyline&gt;
      &lt;polyline points=&#34;8 6 2 12 8 18&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
    &lt;span class=&#34;code-language&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;button class=&#34;code-copy-btn&#34; title=&#39;复制代码&#39; aria-label=&#39;复制代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;
      &lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;button class=&#34;code-expand-btn&#34; title=&#39;折叠代码&#39; aria-label=&#39;折叠代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;18 15 12 9 6 15&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;div class=&#34;code-content-wrapper&#34;&gt;
    &lt;div class=&#34;code-block-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# include &amp;lt;stdio.h&amp;gt;
# include &amp;lt;stdlib.h&amp;gt;  //包含了exit

//定义了一个数据类型，该数据类型的名字叫做struct Arr, 该数据类型含有三个成员， 分别是pBase, len, cnt;
struct Arr
{
    int *pBase;//存储的是数组的第一个元素的地址
    int len;//数组所能容纳的最大元素的个数
    int cnt;//当前数组有效元素的个数
};


void init_arr(struct Arr * pArr, int length);
bool append_arr(struct Arr * pArr, int val);//追加
bool insert_arr(struct Arr * pArr, int pos, int val);//pos的值从1开始
bool delete_arr(struct Arr * pArr, int pos, int * val);
int get();
bool is_empty(struct Arr * pArr);
bool is_full(struct Arr * pArr);
void sort_arr(struct Arr * pArr);
void show_arr(struct Arr * pArr);
void inversion_arr(struct Arr *pArr);


int main(void)
{
    struct Arr arr;
    int val;

    init_arr(&amp;amp;arr, 6);
//printf(&amp;#34;%d\n&amp;#34;, arr.len);
    show_arr(&amp;amp;arr);
    append_arr(&amp;amp;arr, 1);
    append_arr(&amp;amp;arr, 5);
    append_arr(&amp;amp;arr, -3);
    append_arr(&amp;amp;arr, 2);
    append_arr(&amp;amp;arr, 10);
    append_arr(&amp;amp;arr, -1);


    show_arr(&amp;amp;arr);

    printf(&amp;#34;倒置之后的数组内容是：&amp;#34;);
    inversion_arr(&amp;amp;arr);
    show_arr(&amp;amp;arr);

    sort_arr(&amp;amp;arr);
    show_arr(&amp;amp;arr);

    return 0;
}

void init_arr(struct Arr * pArr, int length)
{
    pArr-&amp;gt;pBase = (int *)malloc(sizeof(int) * length);
    if (NULL == pArr-&amp;gt;pBase)
    {
        printf(&amp;#34;动态内存分配失败！\n&amp;#34;);
        exit(-1);//终止整个函数
    }
    else
    {
        pArr-&amp;gt;len = length;
        pArr-&amp;gt;cnt = 0;
    }
    return ;
}

bool is_empty(struct Arr * pArr)
{
    if (pArr-&amp;gt;cnt == 0)
        return true;
    else
        return false;
}

bool is_full(struct Arr * pArr)
{
    if (pArr-&amp;gt;cnt == pArr-&amp;gt;len)
        return true;
    else
        return false;
}

void show_arr(struct Arr * pArr)
{
    if ( is_empty(pArr) )
    {
        printf(&amp;#34;数组为空!\n&amp;#34;);
    }
    else
    {
        for (int i = 0; i &amp;lt; pArr-&amp;gt;cnt; i++)
            printf(&amp;#34;%d &amp;#34;, pArr-&amp;gt;pBase[i]);
        printf(&amp;#34;\n&amp;#34;);
    }
}

bool append_arr(struct Arr * pArr, int val)
{
    if ( is_full(pArr) )
        return false;
    pArr-&amp;gt;pBase[pArr-&amp;gt;cnt] = val;
    pArr-&amp;gt;cnt++;
    return true;
}

bool insert_arr(struct Arr * pArr, int pos, int val)
{
    int i;

    if (is_full(pArr))
        return false;

    if (pos &amp;lt; 1 || pos &amp;gt; pArr-&amp;gt;cnt + 1)
        return false;

    for (i = pArr-&amp;gt;cnt - 1; i &amp;gt;= pos - 1; i--)
    {
        pArr-&amp;gt;pBase[i + 1] = pArr-&amp;gt;pBase[i];
    }
    pArr-&amp;gt;pBase[pos - 1] = val;
    (pArr-&amp;gt;cnt)++;

    return true;
}

bool delete_arr(struct Arr * pArr, int pos, int *pVal)
{
    if (is_empty(pArr))
        return false;
    if (pos &amp;lt; 1 || pos &amp;gt; pArr-&amp;gt;cnt)
        return false;

    *pVal = pArr-&amp;gt;pBase[pos - 1];
    for (int i = pos; i &amp;lt; pArr-&amp;gt;cnt; i++)
        pArr-&amp;gt;pBase[i - 1] = pArr-&amp;gt;pBase[i];

    (pArr-&amp;gt;cnt)--;
    return true;
}

void inversion_arr(struct Arr *pArr)
{
    int i = 0;
    int j = pArr-&amp;gt;len - 1;

    int t;

    while (i &amp;lt; j)
    {
        t = pArr-&amp;gt;pBase[i];
        pArr-&amp;gt;pBase[i] = pArr-&amp;gt;pBase[j];
        pArr-&amp;gt;pBase[j] = t;
        i++;
        j--;
    }

    return ;
}

void sort_arr(struct Arr * pArr)
{
    int i, j, t;

    for (i = 0; i &amp;lt; pArr-&amp;gt;cnt; i++)
    {
        for (j = i + 1; j &amp;lt; pArr-&amp;gt;cnt; j++)
        {
            if (pArr-&amp;gt;pBase[i] &amp;gt; pArr-&amp;gt;pBase[j])
            {
                t = pArr-&amp;gt;pBase[i];
                pArr-&amp;gt;pBase[i] = pArr-&amp;gt;pBase[j];
                pArr-&amp;gt;pBase[j] = t;
            }
        }
    }

}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>C&#43;&#43; 单链表的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-basic-operation-of-single-chain-table/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-basic-operation-of-single-chain-table/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;C++ 单链表的基本操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验二单链表的基本操作&#34;&gt;实验二：单链表的基本操作&lt;/h2&gt;
&lt;p&gt;编写一个完整的程序，实现单链表的建立、插入、删除、输出等基本操作。&lt;/p&gt;
&lt;p&gt;（1）建立一个带头结点的单链表。&lt;/p&gt;
&lt;p&gt;（2）计算单链表的长度，然后输出单链表。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>栈和队列的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-basic-operations-of-stacks-and-queues/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-basic-operations-of-stacks-and-queues/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;实验四：栈和队列的基本操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验四栈和队列的基本操作&#34;&gt;实验四：栈和队列的基本操作&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;采用链式存储实现栈的初始化、入栈、出栈操作。&lt;/li&gt;
&lt;li&gt;采用顺序存储实现栈的初始化、入栈、出栈操作。&lt;/li&gt;
&lt;li&gt;采用链式存储实现队列的初始化、入队、出队操作。&lt;/li&gt;
&lt;li&gt;采用顺序存储实现循环队列的初始化、入队、出队操作。&lt;/li&gt;
&lt;li&gt;在主函数中设计一个简单的菜单，分别测试上述算法。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;综合训练：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>C&#43;&#43; 二叉树的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-binary-tree/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-binary-tree/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;C++ 二叉树的基本操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验五二叉树的基本操作&#34;&gt;实验五：二叉树的基本操作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;（1）输入字符序列，建立二叉链表。&lt;/li&gt;
&lt;li&gt;（2）先序、中序、后序遍历二叉树:递归算法。&lt;/li&gt;
&lt;li&gt;（3）中序遍历二叉树:非递归算法。（最好也能实现先序、后序非递归算法）&lt;/li&gt;
&lt;li&gt;（4）求二叉树的高度 。&lt;/li&gt;
&lt;li&gt;（5）求二叉树的叶子个数。&lt;/li&gt;
&lt;li&gt;（6）借助队列实现二叉树的层次遍历。&lt;/li&gt;
&lt;li&gt;（7）在主函数中设计一个简单的菜单，分别调试上述算法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;源码&#34;&gt;源码&lt;/h2&gt;
&lt;div class=&#34;code-block-wrapper code-collapsible&#34; data-language=&#34;&#34;&gt;
  &lt;div class=&#34;code-block-header&#34;&gt;
    &lt;svg
      class=&#34;code-icon&#34;
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;14&#34;
      height=&#34;14&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2.5&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;16 18 22 12 16 6&#34;&gt;&lt;/polyline&gt;
      &lt;polyline points=&#34;8 6 2 12 8 18&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
    &lt;span class=&#34;code-language&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;button class=&#34;code-copy-btn&#34; title=&#39;复制代码&#39; aria-label=&#39;复制代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;
      &lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;button class=&#34;code-expand-btn&#34; title=&#39;折叠代码&#39; aria-label=&#39;折叠代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;18 15 12 9 6 15&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;div class=&#34;code-content-wrapper&#34;&gt;
    &lt;div class=&#34;code-block-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define LIST_INT_SIZE 100
#define LISTINCREMENT 10
int dep, count = 0;
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
//建立二叉树
Status CreateBiTree(BiTree &amp;amp;T)
{
    char ch;
    getchar();
    scanf(&amp;#34;%c&amp;#34;, &amp;amp;ch);
    if (ch == &amp;#39; &amp;#39; || ch == &amp;#39;\n&amp;#39;)
    {
        T = NULL;
        return ERROR;
    }
    else
    {
        T = (BiTree)malloc(sizeof(BiTNode));
        T-&amp;gt;data = ch;
        printf(&amp;#34;请输入%c的左孩子：&amp;#34;, T-&amp;gt;data);
        CreateBiTree(T-&amp;gt;lchild);
        printf(&amp;#34;请输入%c的右孩子：&amp;#34;, T-&amp;gt;data);
        CreateBiTree(T-&amp;gt;rchild);
        return OK;
    }
}
//主菜单
void print()
{
    printf(&amp;#34;\n菜单如下：\n&amp;#34;);
    printf(&amp;#34;1 . 输入字符序列，建立二叉链表\n&amp;#34;);
    printf(&amp;#34;2 . 先序、中序、后序遍历二叉树:递归算法\n&amp;#34;);
    printf(&amp;#34;3 . 先序、中序、后序遍历二叉树:非递归算法\n&amp;#34;);
    printf(&amp;#34;4 . 求二叉树的高度 \n&amp;#34;);
    printf(&amp;#34;5 . 求二叉树的叶子个数\n&amp;#34;);
    printf(&amp;#34;6 . 借助队列实现二叉树的层次遍历\n&amp;#34;);
    printf(&amp;#34;0 . EXIT\n请选择操作序号：&amp;#34;);
}
//先序、中序、后序遍历二叉树:递归算法
void print2()
{
    printf(&amp;#34;\n递归算法遍历二叉树，菜单如下：\n&amp;#34;);
    printf(&amp;#34;1.先根遍历\n&amp;#34;);
    printf(&amp;#34;2.中序遍历\n&amp;#34;);
    printf(&amp;#34;3.后续遍历\n&amp;#34;);
    printf(&amp;#34;0.退出\n&amp;#34;);
    printf(&amp;#34;请输入二级菜单选择:&amp;#34;);
}
Status Visit(BiTree T)
{
    if (T)
    {
        printf(&amp;#34;%c &amp;#34;, T-&amp;gt;data);
        return OK;
    }
}
Status PrintElement(TElemType e)
{
    printf(&amp;#34; %c &amp;#34;, e);
    return OK;
}
//先序
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType e))
{
    if (T)
    {
        if (Visit(T-&amp;gt;data))
            if (PreOrderTraverse(T-&amp;gt;lchild, Visit))
                if (PreOrderTraverse(T-&amp;gt;rchild, Visit))
                    return OK;
        return ERROR;
    }
    else
        return OK;
}
//中序
Status MidOrderTraverse(BiTree T, Status (*Visit)(TElemType e))
{
    if (T)
    {
        if (MidOrderTraverse(T-&amp;gt;lchild, Visit))
            if (Visit(T-&amp;gt;data))
                if (MidOrderTraverse(T-&amp;gt;rchild, Visit))
                    return OK;
        return ERROR;
    }
    else
        return OK;
}
//后序
Status LastOrderTraverse(BiTree T, Status (*Visit)(TElemType e))
{
    if (T)
    {
        if (LastOrderTraverse(T-&amp;gt;lchild, Visit))
            if (LastOrderTraverse(T-&amp;gt;rchild, Visit))
                if (Visit(T-&amp;gt;data))
                    return OK;
        return ERROR;
    }
    else
        return OK;
}
//求树的叶子的个数,和打印出叶子
Status LeafNumTree(BiTree T)
{
    int lnum, rnum;
    if (T != NULL)
    {
        if (T-&amp;gt;lchild == NULL &amp;amp;&amp;amp; T-&amp;gt;rchild == NULL)
            return 1;
        else
        {
            lnum = LeafNumTree(T-&amp;gt;lchild);
            rnum = LeafNumTree(T-&amp;gt;rchild);
            return lnum + rnum;
        }
    }
    return 0;
}
//求二叉树的高度
Status BiTreeDepth(BiTree T)
{
    int l, r;
    if (T)
    {
        l = BiTreeDepth(T-&amp;gt;lchild);
        r = BiTreeDepth(T-&amp;gt;rchild);
        if (l &amp;gt;= r)
            dep += l;
        else dep += r;
    }
    else
        return 1;
}
//先序、中序、后序遍历二叉树:非递归算法
void print3()
{
    printf(&amp;#34;\n非递归算法遍历二叉树，菜单如下：\n&amp;#34;);
    printf(&amp;#34;1.先根遍历\n&amp;#34;);
    printf(&amp;#34;0.退出\n&amp;#34;);
    printf(&amp;#34;请输入二级菜单选择:&amp;#34;);
}
typedef struct QueueNode
{
    BiTree e;
    struct QueueNode *next;
} QueueNode, *QueuePtr;                 //定义队列结点结构
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
} LinkQueue;
//栈的顺序存储表示
typedef struct
{
    BiTNode *base;   //栈底指针
    BiTNode *top;    //栈顶指针
    int   stacksize; //当前已分配的存储空间
} SqStack;
//初始化一个带头结点的队列
void InitQueue(LinkQueue &amp;amp;q)
{
    q.front = q.rear = (QueuePtr)malloc(sizeof(QueueNode));
    q.front-&amp;gt;next = NULL;
}
//入队列
void enqueue(LinkQueue &amp;amp;q, BiTree p)
{
    QueuePtr s;
    int first = 1;
    s = (QueuePtr)malloc(sizeof(QueueNode));
    s-&amp;gt;e = p;
    s-&amp;gt;next = NULL;
    q.rear-&amp;gt;next = s;
    q.rear = s;
}
//出队列
void dequeue(LinkQueue &amp;amp;q, BiTree &amp;amp;p)
{
    char data;
    QueuePtr s;
    s = q.front-&amp;gt;next;
    p = s-&amp;gt;e ;
    data = p-&amp;gt;data;
    q.front-&amp;gt;next = s-&amp;gt;next;
    if (q.rear == s)
        q.rear = q.front;
    free(s);
    printf(&amp;#34;%c\t&amp;#34;, data);
}
//判断队列是否为空
Status queueempty(LinkQueue q)
{
    if (q.front-&amp;gt;next == NULL)
        return 1;
    return 0;
}
//按层次遍历树中结点
void Traverse(BiTree T)
{
    LinkQueue q;
    BiTree p;
    InitQueue(q);
    p = T;
    enqueue(q, p);
    while (queueempty(q) != 1)
    {
        dequeue(q, p);
        if (p-&amp;gt;lchild != NULL)
            enqueue(q, p-&amp;gt;lchild);
        if (p-&amp;gt;rchild != NULL)
            enqueue(q, p-&amp;gt;rchild);
    }
    printf(&amp;#34;\n&amp;#34;);
}
//建立一个空栈
void InitStack(SqStack &amp;amp;S)
{
    S.base = (BiTree)malloc(LIST_INT_SIZE * sizeof(BiTNode));
    if (!S.base)
        exit(OVERFLOW );//存储分配失败
    S.top = S.base;
    S.stacksize = LIST_INT_SIZE;
}
//压入栈
void Push(SqStack &amp;amp; S, BiTree p)
{
    if (S.top - S.base &amp;gt;= S.stacksize) //满栈，追加存储结构
    {
        S.base = (BiTree)realloc(S.base, (S.stacksize + LISTINCREMENT) * sizeof(BiTNode));
        if (!S.base)  exit(OVERFLOW ); //存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += LISTINCREMENT;
    }
    *(++S.top) = *p;
}
//退出栈
bool Pop(SqStack &amp;amp;S, BiTree &amp;amp;p)
{
    if ( S.top == S.base)
    {
        printf(&amp;#34;空栈\n&amp;#34;);
        return false;
    }
    p = (BiTree)malloc( sizeof(BiTNode));
    *p = *S.top;
    --S.top;
    return true;
}
//判断是否是空栈
bool StackEmpty(SqStack &amp;amp;S)
{
    if ( S.top == S.base)
        return true;
    else
        return  false ;
}
Status InOrderTraverAndCountLeaf(BiTree &amp;amp;T, Status(* Vist)(TElemType e))
{
    int j = 0, count = 0;
    BiTree p;
    p = (BiTNode *)malloc( sizeof(BiTNode)); //关键一步
    p = T;
    SqStack s;
    InitStack(s);
    while (p || !StackEmpty(s))
    {
        if (p)
        {
            Push(s, p); //如果p为非空，将p压入栈
            if (!(p-&amp;gt;lchild) &amp;amp;&amp;amp; !(p-&amp;gt;rchild))
                ++count;//记录叶子节点数
            p = p-&amp;gt;lchild;
        }//if
        else
        {
            Pop(s, p); //如果p为空，则p退栈
            Vist(p-&amp;gt;data);
            p = p-&amp;gt;rchild;
        }//else
    }//while
    return  count;
}
int main()
{
    int n, ncase;
    int count;
    bool f, f1, f2, f3;
    BiTree T;
    TElemType e;
    print();
    while (scanf(&amp;#34;%d&amp;#34;, &amp;amp;n) != EOF)
    {
        f = true;
        switch (n)
        {
        case 1:
            printf(&amp;#34;输入空格或回车表示此结点为空结束\n请输入头结点：&amp;#34;);
            if (CreateBiTree(T))
                printf(&amp;#34;二叉树建立成功!\n&amp;#34;);
            else
                printf(&amp;#34;二叉树建立失败!\n&amp;#34;);
            break;
        case 2:
            print2();
            while (scanf(&amp;#34;%d&amp;#34;, &amp;amp;ncase) != EOF)
            {
                f1 = true;
                switch (ncase)
                {
                case 1:
                    printf(&amp;#34;先序遍历顺序为：&amp;#34;);
                    if (PreOrderTraverse(T, PrintElement))
                        printf(&amp;#34;先序遍历成功!\n&amp;#34;);
                    else
                        printf(&amp;#34;先序遍历失败!\n&amp;#34;);
                    break;
                case 2:
                    printf(&amp;#34;中序遍历顺序为：&amp;#34;);
                    if (MidOrderTraverse(T, PrintElement))
                        printf(&amp;#34;中序遍历成功!\n&amp;#34;);
                    else
                        printf(&amp;#34;中序遍历失败!\n&amp;#34;);
                    break;
                case 3:
                    printf(&amp;#34;后序遍历顺序为：&amp;#34;);
                    if (LastOrderTraverse(T, PrintElement))
                        printf(&amp;#34;后序遍历成功!\n&amp;#34;);
                    else
                        printf(&amp;#34;后序遍历失败!\n&amp;#34;);
                    break;
                case 0:
                    f1 = false;
                    break;
                default :
                    printf(&amp;#34;输入错误，请重新输入!\n&amp;#34;);
                }
                if (!f1)
                    break;
                print2();
            }
            break;
        case 3:
            print3();
            while (scanf(&amp;#34;%d&amp;#34;, &amp;amp;ncase) != EOF)
            {
                f2 = true;
                switch (ncase)
                {
                case 1:
                    InOrderTraverAndCountLeaf(T, PrintElement);
                    break;
                case 0:
                    f2 = false;
                    break;
                default :
                    printf(&amp;#34;输入错误，请重新输入!\n&amp;#34;);
                }
                if (!f2)
                    break;
                print3();
            }
            break;
        case 4:
            dep = 0;
            BiTreeDepth(T);
            printf(&amp;#34;二叉树的高度为：%d\n&amp;#34;, dep - 1);
            break;
        case 5:
            count = LeafNumTree(T);
            printf(&amp;#34;二叉树的叶子个数为：%d\n&amp;#34;, count);
            break;
        case 6:
            printf(&amp;#34;按层次遍历的顺序为:\n&amp;#34;);
            Traverse(T);
            printf(&amp;#34;\n&amp;#34;);
            break;
        case 0:
            f = false;
            break;
        default:
            printf(&amp;#34;输入错误，请重新输入!\n&amp;#34;);
            break;
        }
        if (!f)
        {
            printf(&amp;#34;退出程序...\n&amp;#34;);
            break;
        }
        print();
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>图的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-graph-operation/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-graph-operation/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;实验七：图的基本操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验七图的基本操作&#34;&gt;实验七：图的基本操作&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;键盘输入数据，建立一个有向图的邻接表。&lt;/li&gt;
&lt;li&gt;输出该邻接表。&lt;/li&gt;
&lt;li&gt;在有向图的邻接表的基础上计算各顶点的度，并输出。&lt;/li&gt;
&lt;li&gt;以有向图的邻接表为基础实现输出它的拓扑排序序列。&lt;/li&gt;
&lt;li&gt;采用邻接表存储实现无向图的深度优先遍历。&lt;/li&gt;
&lt;li&gt;采用邻接表存储实现无向图的广度优先遍历。&lt;/li&gt;
&lt;li&gt;采用邻接矩阵存储实现无向图的最小生成树的PRIM算法。&lt;/li&gt;
&lt;li&gt;采用邻接矩阵存储一个有向图，输出单源点到其它顶点的最短路径。&lt;/li&gt;
&lt;li&gt;在主函数中设计一个简单的菜单，分别调试上述算法。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;综合训练：为计算机专业设计教学计划：4个学年，每学年2个学期，开设50门课程，每学期所开课程门数尽量均衡，课程的安排必须满足先修关系。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>C&#43;&#43; 哈夫曼编码</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-huffman-coding/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-huffman-coding/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;哈夫曼编码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验六哈夫曼编码&#34;&gt;实验六：哈夫曼编码&lt;/h2&gt;
&lt;p&gt;已知某系统在通信联络中只可能出现8种字符，其概率分别为0.05，0.29，0.07，0.08，0.14，0.23，0.03，0.11，试设计哈夫曼编码。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>C&#43;&#43; 排序的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-sort/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-sort/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;C++ 排序的基本操作，实现简单选择排序、直接插入排序和冒泡排序；希尔排序；快速排序；堆排序；链式存储实现简单选择排序、直接插入排序和冒泡排序&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验八排序的基本操作&#34;&gt;实验八：排序的基本操作&lt;/h2&gt;
&lt;p&gt;输入一组关键字序列分别实现下列排序:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>C&#43;&#43; 双向链表的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-two-directional-chain-list/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-c-plus-plus-two-directional-chain-list/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;双向链表的基本操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验三双向链表的基本操作&#34;&gt;实验三：双向链表的基本操作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;利用尾插法建立一个双向链表。&lt;/li&gt;
&lt;li&gt;遍历双向链表。&lt;/li&gt;
&lt;li&gt;实现双向链表中删除一个指定元素。&lt;/li&gt;
&lt;li&gt;在非递减有序双向链表中实现插入元素e仍有序算法。&lt;/li&gt;
&lt;li&gt;判断双向链表中元素是否对称若对称返回1否则返回0。&lt;/li&gt;
&lt;li&gt;设元素为正整型,实现算法把所有奇数排列在偶数之前。&lt;/li&gt;
&lt;li&gt;在主函数中设计一个简单的菜单调试上述算法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;源码&#34;&gt;源码&lt;/h2&gt;
&lt;div class=&#34;code-block-wrapper code-collapsible&#34; data-language=&#34;&#34;&gt;
  &lt;div class=&#34;code-block-header&#34;&gt;
    &lt;svg
      class=&#34;code-icon&#34;
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;14&#34;
      height=&#34;14&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2.5&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;16 18 22 12 16 6&#34;&gt;&lt;/polyline&gt;
      &lt;polyline points=&#34;8 6 2 12 8 18&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
    &lt;span class=&#34;code-language&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;button class=&#34;code-copy-btn&#34; title=&#39;复制代码&#39; aria-label=&#39;复制代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;
      &lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;button class=&#34;code-expand-btn&#34; title=&#39;折叠代码&#39; aria-label=&#39;折叠代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;18 15 12 9 6 15&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;div class=&#34;code-content-wrapper&#34;&gt;
    &lt;div class=&#34;code-block-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#define ERROR       -1
#define OK      1
#define OVERFLOW    -2
typedef int ElemType;
typedef int Status;
typedef struct DuLNode {
    ElemType    data;
    struct DuLNode  *prior;
    struct DuLNode  *next;
}DuLNode, * DuLinkList;
/* 创建双链表 */
Status InsertDuLinkList_real( DuLinkList L )
{
    int n, i, c;
    printf( &amp;#34;请输入要创建双链表的长度n=&amp;#34; );
    scanf( &amp;#34;%d&amp;#34;, &amp;amp;n );
    DuLinkList p, dl;
    dl = L;
    printf( &amp;#34;请依次输入数据：&amp;#34; );
    for ( i = 0; i &amp;lt; n; i++ )
    {
        if ( !(p = (DuLinkList) malloc( sizeof(DuLNode) ) ) )
            return(OVERFLOW);
        scanf( &amp;#34;%d&amp;#34;, &amp;amp;c );
        p-&amp;gt;data     = c;
        dl-&amp;gt;next    = p;
        p-&amp;gt;prior    = dl;
        p-&amp;gt;next     = L;
        L-&amp;gt;prior    = p;
        dl      = p;
    }
    return(OK);
}


/* 遍历双链表 */
Status pDuLinkList( DuLinkList L )
{
    DuLinkList dl;
    dl = L-&amp;gt;next;
    while ( dl-&amp;gt;next != L )
    {
        printf( &amp;#34;%d &amp;#34;, dl-&amp;gt;data );
        dl = dl-&amp;gt;next;
    }
    printf( &amp;#34;%d\n&amp;#34;, dl-&amp;gt;data );
    return(OK);
}


DuLinkList GetElemP_DuL( DuLinkList L, ElemType i )
{
    DuLinkList dl;
    dl = L-&amp;gt;next;
    while ( dl != L )
    {
        if ( dl-&amp;gt;data == i )
            return(dl);
    }
    return(NULL);
}


/* 双链表的删除,实现双向链表中删除一个指定元素 */
Status LinkDelete_Dul( DuLinkList L, int i )
{
    DuLinkList p;
    if ( !(p = GetElemP_DuL( L, i ) ) )
        return(ERROR);
    p-&amp;gt;prior-&amp;gt;next =
        p-&amp;gt;next;
    p-&amp;gt;next-&amp;gt;prior =
        p-&amp;gt;prior;
    free( p );
    return(OK);
}


Status GetLengthOfDL( DuLinkList L )
{
    int     n = 0;
    DuLinkList  dl;
    dl = L-&amp;gt;next;
    while ( dl != L )
    {
        n++;
        dl = dl-&amp;gt;next;
    }
    return(n);
}


/* 实现双链表的指定位置的删除 */
Status LinkDelete_Dd( DuLinkList L, int i )
{
    if ( i &amp;gt; GetLengthOfDL( L ) || i &amp;lt; 1 )
    {
        printf( &amp;#34;删除下标非法!\n&amp;#34; );
        return(ERROR);
    }
    DuLinkList  dl;
    int     n = 1;
    dl = L-&amp;gt;next;
    while ( n &amp;lt; i )
    {
        n++;
        dl = dl-&amp;gt;next;
    }
/* p = dl-&amp;gt;prior; */
    dl-&amp;gt;prior-&amp;gt;next =
        dl-&amp;gt;next;
    dl-&amp;gt;next-&amp;gt;prior =
        dl-&amp;gt;prior;
    free( dl );
    return(OK);
}


/* 排序 */
Status sortDuLinkList( DuLinkList L )
{
    int n = GetLengthOfDL( L );
/* printf(&amp;#34;%d&amp;#34;,n); */
    int     t;
    DuLinkList  p;
    for ( int i = 1; i &amp;lt; n; i++ )
    {
        p = L-&amp;gt;next;
        for ( int j = 0; j &amp;lt; n - i; j++ )
        {
            if ( p-&amp;gt;data &amp;gt;
                 p-&amp;gt;next-&amp;gt;data )
            {
                t   = p-&amp;gt;data;
                p-&amp;gt;data =
                    p-&amp;gt;next-&amp;gt;data;
                p-&amp;gt;next-&amp;gt;data = t;
            }
            p = p-&amp;gt;next;
        }
    }
    return(OK);
}


/* 插入 */
Status InsertDuL( DuLinkList L, int n )
{
/* printf(&amp;#34;dd&amp;#34;); */
    DuLinkList p, dl;
    if ( !(dl = (DuLinkList) malloc( sizeof(DuLNode) ) ) )
        return(OVERFLOW);
    p       = L-&amp;gt;next;
    dl-&amp;gt;data    = n;
    while ( p-&amp;gt;data &amp;lt; n )
        p = p-&amp;gt;next;
    printf( &amp;#34;%d&amp;#34;, p-&amp;gt;data );
    p-&amp;gt;prior-&amp;gt;next  = dl;
    dl-&amp;gt;prior   = p-&amp;gt;prior;
    p-&amp;gt;prior    = dl;
    dl-&amp;gt;next    = p;
    return(OK);
}


/* 判断双链表是否对称 */
Status isReturnDuL( DuLinkList L )
{
    DuLinkList p, q;
    p   = L-&amp;gt;next;
    q   = L-&amp;gt;prior;
    int n = GetLengthOfDL( L );
    if ( n % 2 )
    {
        while ( p-&amp;gt;data == q-&amp;gt;data &amp;amp;&amp;amp; p != q )
        {
            p = p-&amp;gt;next; q = q-&amp;gt;prior;
        }
        if ( q == p )
            return(1);
        else
            return(0);
    }else{
        while ( p-&amp;gt;data == q-&amp;gt;data &amp;amp;&amp;amp; p-&amp;gt;next != q )
        {
            p = p-&amp;gt;next; q = q-&amp;gt;prior;
        }
        if ( p-&amp;gt;data == q-&amp;gt;data )
            return(1);
        else
            return(0);
    }
}


/* 实现算法把所有奇数排列在偶数之前 */
Status inLawSort( DuLinkList L )
{
    DuLinkList  p, dl, p1;
    int     i, n = GetLengthOfDL( L );
    i   = 0;
    p   = L-&amp;gt;next;
    dl  = L-&amp;gt;prior;
    while ( i &amp;lt; n )
    {
        if ( (p-&amp;gt;data) % 2 != 0 )
        {
            i++;
            p = p-&amp;gt;next;
        }else  {
            p1      = p-&amp;gt;next;
            p-&amp;gt;next-&amp;gt;prior  =
                p-&amp;gt;prior;
            p-&amp;gt;prior-&amp;gt;next =
                p-&amp;gt;next;
            p-&amp;gt;next     = L;
            p-&amp;gt;prior    = dl;
            dl-&amp;gt;next    = p;
            L-&amp;gt;prior    = p;
            dl      = p;
            p       = p1;
            i++;
        }
    }
    return(OK);
}


void print()
{
    printf( &amp;#34;欢迎测试双链表,菜单如下：\n&amp;#34; );
    printf( &amp;#34;1.运用尾差法创建双链表\n&amp;#34; );
    printf( &amp;#34;2.遍历双向链表\n&amp;#34; );
    printf( &amp;#34;3.实现双链表删除一个指定元素\n&amp;#34; );
    printf( &amp;#34;4.在非递减有序双向链表中实现插入元素e仍有序\n&amp;#34; );
    printf( &amp;#34;5.判断双向链表中元素是否对称若对称返回1否则返回0\n&amp;#34; );
    printf( &amp;#34;6.实现算法把所有奇数排列在偶数之前\n&amp;#34; );
    printf( &amp;#34;0.EXIT\n&amp;#34; );
    printf( &amp;#34;请选择操作序号：&amp;#34; );
}


int main()
{
    DuLinkList  L;
    Status      e, ch, n;
    bool        flag = true;
    L       = (DuLinkList) malloc( sizeof(DuLNode) );
    L-&amp;gt;prior    = NULL;
    L-&amp;gt;next     = NULL;
    print();
    while ( scanf( &amp;#34;%d&amp;#34;, &amp;amp;ch ) != EOF )
    {
        switch ( ch )
        {
        case 0:
            flag = false;
            break;
        case 1:
            if ( InsertDuLinkList_real( L ) )
                printf( &amp;#34;创建成功！\n&amp;#34; );
            else
                printf( &amp;#34;创建失败!\n&amp;#34; );
            break;
        case 2:
            if ( pDuLinkList( L ) )
                printf( &amp;#34;遍历成功!\n&amp;#34; );
            else
                printf( &amp;#34;遍历失败!\n&amp;#34; );
            break;
        case 3:
            printf( &amp;#34;请选择删除方式：1.删除指定元素  2.删除制定下标\n&amp;#34; );
            printf( &amp;#34;请输入选择序号e=&amp;#34; );
            scanf( &amp;#34;%d&amp;#34;, &amp;amp;e );
            switch ( e )
            {
            case 1:
                printf( &amp;#34;请输入指定元素n=&amp;#34; );

                scanf( &amp;#34;%d&amp;#34;, &amp;amp;n );

                if ( LinkDelete_Dul( L, n ) )

                    printf( &amp;#34;指定元素已删除!\n&amp;#34; );
                else

                    printf( &amp;#34;指定元素删除失败!\n&amp;#34; );
                break;
            case 2:
                printf( &amp;#34;请输入指定下标n=&amp;#34; );
                scanf( &amp;#34;%d&amp;#34;, &amp;amp;n );
                if ( LinkDelete_Dd( L, n ) )

                    printf( &amp;#34;指定下标删除成功!\n&amp;#34; );
                else

                    printf( &amp;#34;指定下标删除失败!\n&amp;#34; );
            }
            break;
        case 4:
            printf( &amp;#34;按非递减排序双链表!\n&amp;#34; );
            sortDuLinkList( L );
            pDuLinkList( L );
            printf( &amp;#34;请输入插入的元素n=&amp;#34; );
            scanf( &amp;#34;%d&amp;#34;, &amp;amp;n );
            if ( InsertDuL( L, n ) )
                printf( &amp;#34;插入成功!\n&amp;#34; );
            else
                printf( &amp;#34;插入失败!\n&amp;#34; );
            break;
        case 5:
            if ( isReturnDuL( L ) )
                printf( &amp;#34;1\n&amp;#34; );
            else
                printf( &amp;#34;0\n&amp;#34; );
            break;
        case 6:
            if ( inLawSort( L ) )
            {
                printf( &amp;#34;奇前偶后排序成功!\n&amp;#34; );
                pDuLinkList( L );
            }else
                printf( &amp;#34;奇前偶后排序失败!\n&amp;#34; );
            break;
        default:
            printf( &amp;#34;输入错误！\n&amp;#34; );
        }
        if ( !flag )
            break;
    }
    return(0);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>顺序表的基本操作</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2012-06-21-sequence-table-operation/index.html</link>
      <pubDate>Thu, 21 Jun 2012 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2012-06-21-sequence-table-operation/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;实验一：顺序表的基本操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验一顺序表的基本操作&#34;&gt;实验一：顺序表的基本操作&lt;/h2&gt;
&lt;p&gt;编写一个完整的程序，实现顺序表的建立、插入、删除、输出等基本运算。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立一个顺序表，含有n个数据元素。&lt;/li&gt;
&lt;li&gt;输出顺序表及顺序表的长度。&lt;/li&gt;
&lt;li&gt;在顺序表中删除值为x的结点或者删除给定位置i的结点。&lt;/li&gt;
&lt;li&gt;将顺序表就地逆置，即利用原表的存储空间将线性表（a1,a2,&amp;hellip;,an）逆置为（an,an-1,&amp;hellip;,a1）。&lt;/li&gt;
&lt;li&gt;将顺序表按升序排序。&lt;/li&gt;
&lt;li&gt;设顺序表中的数据元素递增有序，将x插入到顺序表的适当位置上，以保持该表的有序性。&lt;/li&gt;
&lt;li&gt;将两个顺序有序表A和B合并为一个有序表C。&lt;/li&gt;
&lt;li&gt;在主函数中设计一个简单的菜单，分别测试上述算法。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;源码&#34;&gt;源码&lt;/h2&gt;
&lt;div class=&#34;code-block-wrapper code-collapsible&#34; data-language=&#34;&#34;&gt;
  &lt;div class=&#34;code-block-header&#34;&gt;
    &lt;svg
      class=&#34;code-icon&#34;
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;14&#34;
      height=&#34;14&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2.5&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;16 18 22 12 16 6&#34;&gt;&lt;/polyline&gt;
      &lt;polyline points=&#34;8 6 2 12 8 18&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
    &lt;span class=&#34;code-language&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;button class=&#34;code-copy-btn&#34; title=&#39;复制代码&#39; aria-label=&#39;复制代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;
      &lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;button class=&#34;code-expand-btn&#34; title=&#39;折叠代码&#39; aria-label=&#39;折叠代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;18 15 12 9 6 15&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;div class=&#34;code-content-wrapper&#34;&gt;
    &lt;div class=&#34;code-block-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0
typedef int ElemType;
typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
} SqList;
int cmp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}
//创建一个空表
int InitList(SqList &amp;amp;L)
{
    L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //分配空间
    if (!L.elem)
        return OVERFLOW;
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}
//在创建的空表中插入数据
int ListInsert(SqList &amp;amp;L, int i, ElemType e)
{
    ElemType* newbase;
//ElemType* q;
    if (i &amp;lt; 0 || i &amp;gt; L.length + 1)
        return ERROR;
    if (L.length &amp;gt;= L.listsize) //当前空间已满，增加新空间
    {
        newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
        if (!newbase)
            return OVERFLOW;
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    L.elem[i] = e;
//printf(&amp;#34;%d &amp;#34;,L.elem[i]);
    L.length++;
    return OK;
}
//删除位置为i的节点
int ListDelete(SqList &amp;amp;L, int i)
{
    ElemType* p;
    ElemType* q;
    if (i &amp;lt; 0 || i &amp;gt; L.length)
        return ERROR;
    p = &amp;amp;(L.elem[i - 1]);
//e=*p;
    q = L.elem + L.length - 1;
    for (++p; p &amp;lt;= q; p++)
        *(p - 1) = *p;
    L.length--;
    return OK;
}
//在顺序表中删除数据x
int DeleteX(SqList &amp;amp;L, int x)
{
    ElemType* p;
    int i;
    for (i = 0; i &amp;lt; L.length; i++)
        if (L.elem[i] == x)
        {
            break;
        }

    p = &amp;amp;L.elem[i];

//free(p);

    for (int j = i; j &amp;lt; L.length - 1; j++)
    {

        L.elem[j] = L.elem[j + 1];
    }

    L.length--;

    return OK;
}
//反转顺序表
int TurnArrond(SqList &amp;amp;L)//翻转顺序表
{
    ElemType* p;
    ElemType* q;
    int t;
    p = &amp;amp;(L.elem[0]);
    q = L.elem + L.length - 1;
    for (p; p &amp;lt; q; p++, q--)
    {
        t = *q;
        *q = *p;
        *p = t;
    }
    return OK;
}
//升序排列顺序表
int ABC(SqList &amp;amp;L)
{
    int a[10000];
    int i;
    for (i = 0; i &amp;lt; L.length; i++)
        a[i] = L.elem[i];
    qsort(a, L.length, sizeof(a[0]), cmp);
    for (i = 0; i &amp;lt; L.length; i++)
        L.elem[i] = a[i];
    return OK;
}
//把顺序表升序排列后插入元素e
int ListInsertABC(SqList &amp;amp;L, ElemType e)
{
    ElemType* newbase;
    int i, j;
    if (L.length + 1 &amp;gt;= L.listsize) //当前空间已满，增加新空间
    {
        newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
        if (!newbase)
            return OVERFLOW;
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    for (i = 0; i &amp;lt; L.length; i++)
        if (e &amp;lt; L.elem[i])
            break;


    for (j = L.length; j &amp;gt; i; j--)
    {

        L.elem[j] = L.elem[j - 1];
    }

    L.length++;

    L.elem[j] = e;

//printf(&amp;#34;%d &amp;#34;,L.elem[i]);

    return OK;
}
//合并顺序表L，L1为L2
int MergeList(SqList L, SqList L1, SqList &amp;amp;L2)
{
    ElemType* pa;
    ElemType* pb;
    ElemType* pc;
    ElemType* pa_last;
    ElemType* pb_last;
    pa = L.elem;
    pb = L1.elem;
//
    L2.elem = pc;
    L2.listsize = L.listsize + L1.listsize;
    pc = L.elem = (ElemType*)malloc(L2.listsize * sizeof(ElemType));
    pa_last = L.elem + L.length - 1;
    pb_last = L1.elem + L1.length - 1;
    while (pa &amp;lt;= pa_last &amp;amp;&amp;amp;
            pb &amp;lt;= pb_last)
    {
        if (*pa &amp;lt;= *pb)
            *pc++ = *pa++;
        else
            *pc++ = *pb++;
    }
    while (pa &amp;lt;= pa_last)
        *pc++ = *pa++;
    while (pb &amp;lt;= pb_last)
        *pc++ = *pb++;
    for (int i = 0; i &amp;lt; L2.length; i++)
        printf(&amp;#34;%d &amp;#34;, L2.elem[i]);
    return OK;
}
//打印菜单
void printScreen()
{
//printf(&amp;#34;1.建立一个顺序表，含有n个数据元素。\n&amp;#34;);
    printf(&amp;#34;1.输出顺序表L1及其长度\n&amp;#34;);
    printf(&amp;#34;2.删除给定位置i的结点\n&amp;#34;);
    printf(&amp;#34;3.在顺序表中删除值为x的结点\n&amp;#34;);
    printf(&amp;#34;4.逆置顺序表\n&amp;#34;);
    printf(&amp;#34;5.将顺序表按升序排序\n&amp;#34;);
    printf(&amp;#34;6.设顺序表中的数据元素递增有序，将x插入到顺序表的适当位置上，以保持该表的有序性\n&amp;#34;);
    printf(&amp;#34;7.将两个顺序有序表L和L1合并为一个有序表L2\n&amp;#34;);
    printf(&amp;#34;0.退出操作系统。\n&amp;#34;);
    printf(&amp;#34;请输入需要的操作序号：&amp;#34;);
}
//输出顺序表L
void printSqList(SqList &amp;amp;L)
{
    int i;
    for (i = 0; i &amp;lt; L.length; i++)
        printf(&amp;#34;%d &amp;#34;, L.elem[i]);
    printf(&amp;#34;\n&amp;#34;);
}
int main()
{
    SqList L, L1, L2;
    InitList(L);
    InitList(L1);
    InitList(L2);
    int n, e, muse, i, x;
    bool flag;
//建立第一个的顺序表
    printf(&amp;#34;请输入第一个数据表的长度：&amp;#34;);
    scanf(&amp;#34;%d&amp;#34;, &amp;amp;n);
    printf(&amp;#34;请以次输入长度为%d的顺序表：&amp;#34;, n);
    for (i = 0; i &amp;lt; n; i++)
    {
        scanf(&amp;#34;%d&amp;#34;, &amp;amp;e);
        ListInsert(L, i, e); //依次在第i个位置插入顺序表
    }
    printf(&amp;#34;第一个顺序表的次序为：&amp;#34;);
    printSqList(L);
//建立第二个顺序表
    printf(&amp;#34;建立第二个顺序表，请输入要第二个建立数据表的长度：&amp;#34;);
    scanf(&amp;#34;%d&amp;#34;, &amp;amp;n);
    printf(&amp;#34;请以次输入长度为%d的顺序表：&amp;#34;, n);
    for (i = 0; i &amp;lt; n; i++)
    {
        scanf(&amp;#34;%d&amp;#34;, &amp;amp;e);
        ListInsert(L1, i, e); //依次在第i个位置插入顺序表
    }
    printf(&amp;#34;第二个顺序表的次序为：&amp;#34;);
    printSqList(L1);
//打印菜单
    printScreen();
    scanf(&amp;#34;%d&amp;#34;, &amp;amp;muse);
    flag = true;
    while (1)
    {
        switch (muse)
        {
        case 0:
            flag = false;
            break;
        case 1:
            printf(&amp;#34;顺序表的长度为：&amp;#34;);
            printf(&amp;#34;%d\n&amp;#34;, L.length);
            break;
        case 2:
            printf(&amp;#34;请输入要删除的节点：&amp;#34;);
            scanf(&amp;#34;%d&amp;#34;, &amp;amp;i); //删除顺序表的节点
            if (ListDelete(L, i))
            {
                printf(&amp;#34;删除成功！\n&amp;#34;);
                printSqList(L);
            }
            else
                printf(&amp;#34;删除失败！\n&amp;#34;);
            break;
        case 3:
            printf(&amp;#34;请输入要删除的节点x的值：&amp;#34;);
            scanf(&amp;#34;%d&amp;#34;, &amp;amp;x);
            if (DeleteX(L, x))
            {
                printf(&amp;#34;删除成功！\n顺序表为：&amp;#34;);
                printSqList(L);
            }
            else
                printf(&amp;#34;删除失败！\n&amp;#34;);
            break;
        case 4:
//逆序顺序表
            if (TurnArrond(L))
            {
                printf(&amp;#34;逆序成功！\n&amp;#34;);
                printf(&amp;#34;顺序表的次序为：&amp;#34;);
                printSqList(L);
            }
            else
                printf(&amp;#34;逆序失败！\n&amp;#34;);
            break;
        case 5:
//顺序表升序排列
            if (ABC(L))
            {
                printf(&amp;#34;顺序表升序排列成功！\n&amp;#34;);
                printf(&amp;#34;顺序表的次序为：&amp;#34;);
                printSqList(L);
            }
            else
                printf(&amp;#34;顺序表升序排列失败！\n&amp;#34;);
            printf(&amp;#34;请输入要插入的数据：&amp;#34;);
            scanf(&amp;#34;%d&amp;#34;, &amp;amp;e);
            if (ListInsertABC(L, e))
            {
                printf(&amp;#34;顺序插入成功！\n&amp;#34;);
                printf(&amp;#34;顺序表的次序为：&amp;#34;);
                printSqList(L);
            }
            else
                printf(&amp;#34;顺序插入失败！\n&amp;#34;);
            break;
        case 6:
            ABC(L);
            printf(&amp;#34;请输入要插入的数字x的值：&amp;#34;);
            scanf(&amp;#34;%d&amp;#34;, &amp;amp;x);
            if (ListInsertABC(L, x))
            {
                printf(&amp;#34;操作成功！\n&amp;#34;);
                printf(&amp;#34;顺序表的次序为：&amp;#34;);
                printSqList(L);
            }
            else printf(&amp;#34;操作失败！\n&amp;#34;);
            break;
        case 7:
            if (MergeList(L, L1, L2))
            {
                printf(&amp;#34;顺序表L，L1合并成功!\n&amp;#34;);
//printf(&amp;#34;顺序表的次序为：&amp;#34;);
//printSqList(L2);
            }
            else
                printf(&amp;#34;顺序表合并失败！\n&amp;#34;);
            break;
        default:
            break;
        }
        if (!flag)
            break;
        printf(&amp;#34;\n请输入你要的下一步操作序号：&amp;#34;);
        scanf(&amp;#34;%d&amp;#34;, &amp;amp;muse);
    }
    if (L.elem)
        free(L.elem);
    if (L1.elem)
        free(L1.elem);
    if (L2.elem)
        free(L2.elem);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>MFC中如何用ADO连接SQL Server 2005</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2013-01-07-mfc-ado-sql-server-2005/index.html</link>
      <pubDate>Mon, 07 Jan 2013 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2013-01-07-mfc-ado-sql-server-2005/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;MFC中如何用ADO连接SQL Server 2005&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;vc-ado连接数据库&#34;&gt;VC++ ADO连接数据库&lt;/h3&gt;
&lt;p&gt;第一步:(以下语句插入相应的文件中,ADOConn.h,可能代码中已经有了)&lt;/p&gt;
&lt;div class=&#34;code-block-wrapper code-collapsible&#34; data-language=&#34;&#34;&gt;
  &lt;div class=&#34;code-block-header&#34;&gt;
    &lt;svg
      class=&#34;code-icon&#34;
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;14&#34;
      height=&#34;14&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2.5&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;16 18 22 12 16 6&#34;&gt;&lt;/polyline&gt;
      &lt;polyline points=&#34;8 6 2 12 8 18&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
    &lt;span class=&#34;code-language&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;button class=&#34;code-copy-btn&#34; title=&#39;复制代码&#39; aria-label=&#39;复制代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;
      &lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;button class=&#34;code-expand-btn&#34; title=&#39;折叠代码&#39; aria-label=&#39;折叠代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;18 15 12 9 6 15&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;div class=&#34;code-content-wrapper&#34;&gt;
    &lt;div class=&#34;code-block-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#import&amp;#34;C:\Program Files\Common Files\System\ado\msado15.dll&amp;#34;no_namespace rename(&amp;#34;EOF&amp;#34;,&amp;#34;adoEOF&amp;#34;)rename(&amp;#34;BOF&amp;#34;,&amp;#34;adoBOF&amp;#34;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第二步:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>MFC使用ADO连接SQL Server数据库</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2013-01-07-mfc-ado-sql-server/index.html</link>
      <pubDate>Mon, 07 Jan 2013 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2013-01-07-mfc-ado-sql-server/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;MFC使用ADO连接SQL Server数据库&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;首先，要用#import语句来引用支持ADO的组件类型库(*.tlb)，其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里，如：被定位在msado15.dll的附属资源中，只需要直接用
#import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block-wrapper code-collapsible&#34; data-language=&#34;&#34;&gt;
  &lt;div class=&#34;code-block-header&#34;&gt;
    &lt;svg
      class=&#34;code-icon&#34;
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;14&#34;
      height=&#34;14&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2.5&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;16 18 22 12 16 6&#34;&gt;&lt;/polyline&gt;
      &lt;polyline points=&#34;8 6 2 12 8 18&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
    &lt;span class=&#34;code-language&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;button class=&#34;code-copy-btn&#34; title=&#39;复制代码&#39; aria-label=&#39;复制代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;
      &lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;button class=&#34;code-expand-btn&#34; title=&#39;折叠代码&#39; aria-label=&#39;折叠代码&#39;&gt;
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      width=&#34;16&#34;
      height=&#34;16&#34;
      viewBox=&#34;0 0 24 24&#34;
      fill=&#34;none&#34;
      stroke=&#34;currentColor&#34;
      stroke-width=&#34;2&#34;
      stroke-linecap=&#34;round&#34;
      stroke-linejoin=&#34;round&#34;
    &gt;
      &lt;polyline points=&#34;18 15 12 9 6 15&#34;&gt;&lt;/polyline&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
  &lt;div class=&#34;code-content-wrapper&#34;&gt;
    &lt;div class=&#34;code-block-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#import &amp;#34;c:/program files/common
files/system/ado/msado15.dll&amp;#34; no_namespace rename(&amp;#34;EOF&amp;#34;, &amp;#34;adoEOF&amp;#34;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时，它会为引用组件类型库中的接口生成包装类，#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件，分别为*.tlh(类型库头文件)及*.tli(类型库实现文件)，它们分别为每一个接口产生智能指针，并为各种接口方法、枚举类型，CLSID等进行声明，创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间，rename (&amp;ldquo;EOF&amp;rdquo;, &amp;ldquo;adoEOF&amp;rdquo;)说明将ADO中结束标志EOF改为adoEOF，以避免和其它库中命名相冲突。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>VC6 MFC中ClassView视图中无法显示某个类的问题</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2013-01-08-vc6-mfc-classview-bug/index.html</link>
      <pubDate>Tue, 08 Jan 2013 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2013-01-08-vc6-mfc-classview-bug/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;VC6 MFC中ClassView视图中无法显示某个类的问题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;在用VC6 MFC编写界面程序时，添加一个对话框资源并向工程中添加该对话框资源对应的类时，发现在工程源代码文件夹以及FileView视图中都能看见对话框类的定义，然而在ClassView视图中却无法看到该类的定义，此现象为VC6 MFC的bug，解决该问题可以考虑用如下两种方法。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>rose生成C&#43;&#43;源代码</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2013-01-10-rose-gen-c-plus-plus-code/index.html</link>
      <pubDate>Thu, 10 Jan 2013 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2013-01-10-rose-gen-c-plus-plus-code/</guid>
      <description>&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;需要先设置类的语言，否则前功尽弃。。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;设置方法：Tools-&amp;gt;Options-&amp;gt;Notation-&amp;gt;把Default的Analysis换成ANSI C++&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>解决&lt;compilation debug=&#34;true&#34; targetFramework=&#34;4.0&#34;&gt; 问题</title>
      <link>https://www.xiexianbin.cn/cpp/demo/2013-03-29-fix-targetframework-4.0-bug/index.html</link>
      <pubDate>Fri, 29 Mar 2013 00:00:00 +0800</pubDate>
      
      <guid>https://www.xiexianbin.cn/cpp/demo/2013-03-29-fix-targetframework-4.0-bug/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;解决&lt;compilation debug=&#34;true&#34; targetFramework=&#34;4.0&#34;&gt; 问题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;
&lt;p&gt;在发布网站的时候，遇到了 这个问题，在网上找了找，解决了自己的问题，但是找的时候很杂，为了方便以后的开发，总结如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开控制面板&amp;ndash;管理工具&amp;ndash;Internet&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;信息服务(IIS)管理器，选择默认网站，在右边的“管理网站”栏里选择“高级设置…”，将“应用程序池”修改为“ASP.NET v4.0 ”。&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
