鱼C论坛

 找回密码
 立即注册
查看: 3135|回复: 2

[技术交流] 《数据结构/严蔚敏》代码 2016/10/22/更新

[复制链接]
发表于 2016-11-1 12:47:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
《数据结构/严蔚敏》代码   2016/10/22/更新
http://program.bbs.am/viewthread.php?tid=159434&fromuid=1
1610222106c036a515e6e51ac7.png
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define INIT_SIZE 5
  4. #define INCREMENT 1
  5. #define OK 1
  6. #define ERROR 0
  7. #define OVERFLOW -1
  8. #define FUNCTIONNUMS 5

  9. typedef int ElemType;
  10. typedef int Status;

  11. typedef struct {
  12.         ElemType *elem;  //存储空间基址
  13.         int length;        //当前长度
  14.         int listsize;       //当前分配的存储容量(以sizeof(ElemType)为单位)
  15. }SqList;

  16. Status InitList_Sq(SqList &L) {
  17.         L.elem = (ElemType *)malloc(sizeof(ElemType)*INIT_SIZE);  //给L.elem分配地址
  18.         if (!L.elem) exit(OVERFLOW);   //存储分配失败
  19.         L.length = 0;                   //空表长度为0
  20.         L.listsize = INIT_SIZE;    //初始存储容量
  21.         return OK;
  22. }// InitList_Sq

  23. Status ListInsert_Sq(SqList &L, int i, ElemType e) {
  24.         //在顺序线性表中第i个位置之前插入新的元素e
  25.         ElemType *newbase, *q, *p;
  26.         if (i<1 || i>L.length + 1) return ERROR;  //i的值不合法
  27.         if (L.length >= L.listsize) {//当前存储空间已满,增加分配
  28.                 newbase = (ElemType *)realloc(L.elem, (L.listsize + INCREMENT)*sizeof(ElemType));
  29.                 if (!newbase) exit(OVERFLOW);//存储分配失败
  30.                 L.elem = newbase;             //新基址
  31.                 L.listsize += INCREMENT;//增加存储容量
  32.         }
  33.         q = &(L.elem[i - 1]);
  34.         for (p = &(L.elem[L.length - 1]);p >= q;--p) {
  35.                 *(p + 1) = *p;
  36.         }//插入位置及之后的元素右移
  37.         *q = e;//插入e
  38.         ++L.length;//表长增1
  39.         return OK;
  40. }// ListInsert_Sq

  41. Status ListDelete_Sq(SqList &L, int i, ElemType &e) {
  42.         //在顺序线性表L中删除第i个元素,并用e返回其值
  43.         //i的合法值为1<=i<=ListLength_Sq(L)
  44.         ElemType *q, *p;
  45.         if (i<1 || i>L.length) return ERROR;//i值不合法
  46.         q = &L.elem[i - 1];//p为被删除元素的位置
  47.         e = *q;//被删除元素的值赋给e
  48.         p = L.elem + L.length - 1;//表尾元素的位置
  49.         for (++q;p >= q;++q) *(q - 1) = *q;//被删除元素之后的元素左移
  50.         --L.length;//表长减1
  51.         return OK;
  52. }

  53. void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) {
  54.         ElemType *pa, *pb, *pc;
  55.         pa = La.elem;
  56.         pb = Lb.elem;
  57.         Lc.listsize = Lc.length = La.length + Lb.length;
  58.         pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
  59.         if (!Lc.elem) exit(OVERFLOW);//存储分配失败
  60.         while ((pa <= La.elem + La.length - 1) && (pb <= Lb.elem + Lb.length - 1)) {//并归
  61.                 if (*pa <= *pb) *pc++ = *pa++;
  62.                 else *pc++ = *pb++;
  63.         }
  64.         while (pa <= La.elem + La.length - 1) *pc++ = *pa++;//插入La的剩余元素
  65.         while (pb <= Lb.elem + Lb.length - 1) *pc++ = *pb++;//插入Lb的剩余元素
  66. }

  67. typedef struct LNode {
  68.         ElemType data;
  69.         struct LNode *next;
  70. }LNode, *LinkList;

  71. void CreateList_L(LinkList &L, int n) {//尾插法
  72.         LinkList p, r;
  73.         int i;
  74.         L = (LinkList)malloc(sizeof(LNode));
  75.         r = L;
  76.         L->next = NULL;
  77.         for (i = 0;i<n;i++) {
  78.                 p = (LinkList)malloc(sizeof(LNode));
  79.                 p->next = NULL;
  80.                 scanf("%d", &p->data);
  81.                 r->next = p;
  82.                 r = p;
  83.         }
  84. }

  85. Status GetElem_L(LinkList &L, int i, ElemType &e) {
  86.         LinkList p;
  87.         int j = 1;
  88.         p = L->next;
  89.         while (p&&j<i) {
  90.                 p = p->next;
  91.                 ++j;
  92.         }
  93.         if (!p || j>i)return ERROR;
  94.         e = p->data;
  95.         return OK;
  96. }

  97. Status ListDelete_L(LinkList &L, int i, ElemType &e) {
  98.         LinkList p = L, q;
  99.         int j = 0;
  100.         while (p->next&&j<i - 1) {
  101.                 p = p->next;
  102.                 j++;
  103.         }
  104.         if (!(p->next) || j>i - 1) return ERROR;
  105.         q = p->next;
  106.         p->next = q->next;
  107.         e = q->data;
  108.         free(q);
  109.         return OK;
  110. }

  111. void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc) {
  112.         LinkList pa = La->next, pb = Lb->next, pc;
  113.         Lc = pc = La;
  114.         while (pa&&pb) {
  115.                 if (pa->data <= pb->data) {
  116.                         pc->next = pa;
  117.                         pc = pa;
  118.                         pa = pa->next;
  119.                 }
  120.                 else {
  121.                         pc->next = pb;
  122.                         pc = pb;
  123.                         pb = pb->next;
  124.                 }
  125.         }
  126.         pc->next = pa ? pa : pb;
  127.         free(Lb);
  128. }

  129. typedef struct Stack {
  130.         ElemType *base;
  131.         ElemType *top;
  132.         int stacksize;
  133. }Stack;

  134. Status InitStack(Stack &S) {
  135.         S.base = S.top = (ElemType *)malloc(sizeof(ElemType)*INIT_SIZE);
  136.         if (!S.base)exit(OVERFLOW);
  137.         S.stacksize = INIT_SIZE;
  138.         return OK;
  139. }

  140. Status PushStack(Stack &S, ElemType e) {
  141.         if ((S.top - S.base) >= S.stacksize) {
  142.                 S.base = (ElemType *)realloc(S.base, sizeof(ElemType)*(S.stacksize + INCREMENT));
  143.                 if (!S.base)exit(OVERFLOW);
  144.                 S.top = S.base + S.stacksize;
  145.                 S.stacksize += INCREMENT;
  146.         }
  147.         *S.top = e;
  148.         S.top++;
  149.         return OK;
  150. }

  151. Status PopStack(Stack &S, ElemType &e) {
  152.         if (S.top == S.base)return ERROR;
  153.         e = *(S.top - 1);
  154.         --S.top;
  155.         return OK;
  156. }

  157. Status GetTop(Stack S, ElemType &e) {
  158.         if (S.top == S.base)return ERROR;
  159.         e = *(S.top - 1);
  160.         return OK;
  161. }

  162. int main()
  163. {
  164.         int n, i, j;
  165.         ElemType e;
  166.         printf("-----------数据结构------------\n");
  167.         while (1) {//循环所有功能
  168.                 printf("功能:\n1、顺序表的初始化、插入以及删除\n2、顺序表的合并\n3、单链表的创建、查找以及删除\n4、单链表的合并\n5、栈的初始化、获取栈顶元素、删除栈顶元素以及增加栈元素\n");
  169.                 printf("-------------------------------\n");
  170.                 printf("请选择功能:");
  171.                 scanf("%d", &n);
  172.                 do {
  173.                         if (n>FUNCTIONNUMS) {
  174.                                 printf("\n功能输入错误,请重新输入:");
  175.                                 scanf("%d", &n);
  176.                         }
  177.                 } while (n>FUNCTIONNUMS);
  178.                 printf("-----------功能:%d-------------\n", n);
  179.                 switch (n) {
  180.                 case 1: {
  181.                         SqList L;
  182.                         printf("请初始化顺序表:");
  183.                         InitList_Sq(L);
  184.                         for (j = 0;j<INIT_SIZE;j++) {
  185.                                 scanf("%d", L.elem + j);
  186.                                 L.length++;
  187.                         }
  188.                         printf("请输入您要插入的位置以及数据,并用“ ”隔开:");
  189.                         scanf("%d%d", &i, &e);
  190.                         ListInsert_Sq(L, i, e);
  191.                         printf("插入后的数据为:");
  192.                         for (j = 0;j<L.length;j++) {
  193.                                 printf("%d ", *(L.elem + j));
  194.                         }
  195.                         printf("\n");
  196.                         printf("请输入您要删除的位置:");
  197.                         scanf("%d", &i);
  198.                         if (ListDelete_Sq(L, i, e)) {
  199.                                 printf("删除成功!\n删除的数据为:%d\n", e);
  200.                                 printf("删除后的数据为:");
  201.                                 for (j = 0;j<L.length;j++) {
  202.                                         printf("%d ", *(L.elem + j));
  203.                                 }
  204.                         }
  205.                         else printf("删除失败!\n请检查删除位置是否有误!");
  206.                         printf("\n");
  207.                         break;
  208.                 }

  209.                 case 2: {
  210.                         SqList La, Lb, Lc;
  211.                         printf("请初始化顺序表1:");
  212.                         InitList_Sq(La);
  213.                         for (j = 0;j<La.listsize;j++) {
  214.                                 scanf("%d", La.elem + j);
  215.                                 La.length++;
  216.                         }
  217.                         printf("请初始化顺序表2:");
  218.                         InitList_Sq(Lb);
  219.                         for (j = 0;j<Lb.listsize;j++) {
  220.                                 scanf("%d", Lb.elem + j);
  221.                                 Lb.length++;
  222.                         }
  223.                         MergeList_Sq(La, Lb, Lc);
  224.                         printf("合并后的顺序表为:");
  225.                         for (j = 0;j<Lc.length;j++) {
  226.                                 printf("%d ", *(Lc.elem + j));
  227.                         }
  228.                         printf("\n");
  229.                         break;
  230.                 }

  231.                 case 3: {
  232.                         LinkList L, p;
  233.                         int i;
  234.                         printf("请初始化单链表:");
  235.                         CreateList_L(L, INIT_SIZE);
  236.                         printf("请问要查找第几个数据:");
  237.                         scanf("%d", &i);
  238.                         if (GetElem_L(L, i, e)) {
  239.                                 printf("查找成功!\n");
  240.                                 printf("第%d个数据为:%d\n", i, e);
  241.                         }
  242.                         else printf("查找失败!请检查输入是否有误!\n");
  243.                         printf("请输入您要删除的位置:");
  244.                         scanf("%d", &i);
  245.                         if (ListDelete_L(L, i, e)) {
  246.                                 p = L;
  247.                                 printf("删除成功!\n删除的数据为:%d\n", e);
  248.                                 printf("删除后的数据为:");
  249.                                 while (p->next) {
  250.                                         p = p->next;
  251.                                         printf("%d ", p->data);
  252.                                 }
  253.                         }
  254.                         else printf("删除失败!\n请检查删除位置是否有误!");
  255.                         printf("\n");
  256.                         break;
  257.                 }

  258.                 case 4: {
  259.                         LinkList La, Lb, Lc, p;
  260.                         printf("请初始化单链表1:");
  261.                         CreateList_L(La, INIT_SIZE);
  262.                         printf("请初始化单链表2:");
  263.                         CreateList_L(Lb, INIT_SIZE);
  264.                         printf("合并后的单链表为:");
  265.                         MergeList_L(La, Lb, Lc);
  266.                         p = Lc->next;
  267.                         while (p) {
  268.                                 printf("%d ", p->data);
  269.                                 p = p->next;
  270.                         }
  271.                         break;
  272.                 }

  273.                 case 5: {
  274.                         Stack S;
  275.                         char ch;
  276.                         printf("请初始化栈:");
  277.                         InitStack(S);
  278.                         for (i = 1;i <= S.stacksize;i++) {
  279.                                 scanf("%d", S.top);
  280.                                 S.top++;
  281.                         }
  282.                         GetTop(S, e);
  283.                         printf("当前栈顶元素为:%d\n", e);
  284.                         printf("是否需要删除栈顶元素(Y/N)?");
  285.                         getchar();
  286.                         ch = getchar();
  287.                         if (ch == 'Y' || ch == 'y') {
  288.                                 if (PopStack(S, e)) {
  289.                                         printf("删除成功!\n删除的数据为:%d\n", e);
  290.                                         printf("当前栈元素为:");
  291.                                         for (i = 0;i<S.top - S.base;i++) {
  292.                                                 printf("%d ", *(S.base + i));
  293.                                         }
  294.                                         printf("\n");
  295.                                 }
  296.                                 else printf("删除失败!当前栈为空,无法删除!\n");
  297.                         }
  298.                         printf("是否需要增加栈元素(Y/N)?");
  299.                         getchar();
  300.                         ch = getchar();
  301.                         if (ch == 'Y' || ch == 'y') {
  302.                                 printf("请输入需要增加的数据:");
  303.                                 scanf("%d", &e);
  304.                                 if (PushStack(S, e)) {
  305.                                         printf("入栈成功!\n");
  306.                                         printf("当前栈元素为:");
  307.                                         for (i = 0;i<S.top - S.base;i++) {
  308.                                                 printf("%d ", *(S.base + i));
  309.                                         }
  310.                                         printf("\n");
  311.                                 }
  312.                                 else printf("入栈失败!内存空间不足!");
  313.                         }




  314.                 }

  315.                 }
  316.                 printf("\n-------------------------------\n");
  317.         }
  318.         return 0;
  319. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-4-11 18:22:22 | 显示全部楼层
好久没来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 20:30:00 | 显示全部楼层
感谢提供!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 21:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表