顺序存储

本文介绍了一种基于顺序表的合并与重复元素删除算法。通过定义顺序表结构,实现初始化、插入、合并及删除重复元素等功能。用户可以输入两个顺序表的数据,程序将输出合并并去重后的结果。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>

  4. #define ERROR 0
  5. #define OK 1
  6. #define EQUAL 1
  7. #define OVERFLOW -1
  8. #define LIST_INIT_SIZE 100
  9. #define LISTINCREMENT 10

  10. typedef struct {
  11.     int *elem;
  12.     int length;
  13.     int listsize;
  14. }SqList;

  15. void InitList (SqList *L);
  16. void ListInsert (SqList *L, int i, int e);
  17. void MergeList (SqList La, SqList Lb, SqList *Lc);
  18. void ListDeleteReprat(SqList *L);
  19. void PrintList (SqList L);

  20. int main ()
  21. {
  22.     SqList La, Lb, Lc;
  23.     int numa, numb;
  24.     int i;
  25.     int TempNum;
  26.     
  27.     InitList (&La);
  28.     printf ("The Number of Second List:");
  29.     scanf ("%d",&numa);
  30.     for (i = 0; i < numa; i++)
  31.     {
  32.         printf ("input %d number:", i+1);
  33.         scanf ("%d", &TempNum);
  34.         ListInsert (&La, i+1, TempNum);
  35.     }

  36.     InitList (&Lb);
  37.     printf ("The Number of Second List:");
  38.     scanf ("%d",&numb);
  39.     for (i = 0; i < numb; i++)
  40.     {
  41.         printf ("input %d number:", i+1);
  42.         scanf ("%d", &TempNum);
  43.         ListInsert (&Lb, i+1, TempNum);
  44.     }
  45.     
  46.     MergeList (La, Lb, &Lc);
  47.     ListDeleteReprat (&Lc);
  48.     
  49.     printf ("First List:");
  50.     PrintList (La);
  51.     printf ("Second List:");
  52.     PrintList (Lb);
  53.     printf ("Union List:");
  54.     PrintList (Lc);
  55.     getch ();
  56. }

  57. void InitList (SqList *L)
  58. {
  59.     L->elem = (int *)malloc(LIST_INIT_SIZE * sizeof (int));
  60.     if (!L->elem)
  61.         exit(OVERFLOW);
  62.     L->length = 0;
  63.     L->listsize = LIST_INIT_SIZE;
  64. }

  65. void ListInsert (SqList *L, int i, int e)
  66. {
  67.     int *q, *p;
  68.     int *newbase;
  69.     if (i < 1 || i > L->length + 1)
  70.         return;
  71.     if (L->length >= L->listsize)
  72.     {
  73.         newbase = (int *)realloc(L->elem,
  74.                                 (L->listsize + LISTINCREMENT)*sizeof(int));
  75.         if (!newbase)
  76.             exit (OVERFLOW);
  77.         L->elem = newbase;
  78.         L->listsize += LISTINCREMENT;
  79.     }
  80.     q = &(L->elem[i-1]);
  81.     for (p = &(L->elem[L->length-1]); p >= q; p--)
  82.     {
  83.         *(p+1) = *p;
  84.     }
  85.     *q = e;
  86.     L->length++;
  87. }

  88. void MergeList (SqList La, SqList Lb, SqList *Lc)
  89. {
  90.     int *pa;
  91.     int *pb;
  92.     int i = 0;
  93.     int j = 0;
  94.     int k = 0;
  95.     InitList (Lc);
  96.     Lc->length = La.length + Lb.length;
  97.     Lc->elem = (int *)malloc(Lc->length * sizeof (int));
  98.     while (i < La.length && j < Lb.length)
  99.     {
  100.         if (La.elem[i] >= Lb.elem[j])
  101.         {
  102.             Lc->elem[k] = La.elem[i];
  103.             i++;
  104.             k++;
  105.         }
  106.         else
  107.         {
  108.             Lc->elem[k] = Lb.elem[j];
  109.             j++;
  110.             k++;
  111.         }
  112.     }
  113.     while (i < La.length)
  114.     {
  115.         Lc->elem[k] = La.elem[i];
  116.         i++;
  117.         k++;
  118.     }
  119.     while (j < La.length)
  120.     {
  121.         Lc->elem[k] = La.elem[j];
  122.         j++;
  123.         k++;
  124.     }
  125. }

  126. void ListDeleteReprat(SqList *L)
  127. {
  128.     int i;
  129.     int j;
  130.     int k;
  131.     for (i = 0; i < L->length - 1; i++)
  132.     {
  133.         for (j = i + 1; j < L->length; j++)
  134.         {
  135.             if (L -> elem[i] == L -> elem[j])
  136.             {
  137.                 k = j;
  138.                 while (k < L->length - 1)
  139.                 {
  140.                     L->elem[k] = L->elem[k+1];
  141.                     k++;
  142.                 }
  143.                 L->length--;
  144.                 j--;
  145.             }
  146.         }
  147.     }
  148. }

  149. void PrintList (SqList L)
  150. {
  151.     int i;
  152.     for (i = 0; i < L.length; i++)
  153.         printf ("%d ", L.elem[i]);
  154.     printf ("\n");
  155. }

阅读(293) | 评论(0) | 转发(0) |
0

上一篇:顺序存储

下一篇:链式存储

给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值