1.线性表

  1 /*******************************************************************
  2  *   > File Name: seqTable.c
  3  *   > Author: fly
  4  *   > Mail: XXXXXXXX@icode.com
  5  *   > Create Time: 2018年06月20日 星期三 09时45分29秒
  6  ******************************************************************/
  7 
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 
 11 #define     Size    4
 12 
 13 typedef struct Table
 14 {
 15     int *head;//声明一个名为head的长度不确定的数组,也叫“动态数组”
 16     int length;//记录当前顺序表的长度
 17     int size;//记录顺序表分配的存储容量
 18 } table;
 19 
 20 table initTable()
 21 {
 22     table t;
 23     t.head = (int*)malloc(Size*sizeof(int));
 24     if(!t.head)
 25     {
 26         perror("malloc error");
 27         exit(0);
 28     }
 29     t.length = 0;//空表的长度初始化为0
 30     t.size = Size;//空表的初始存储空间为Size
 31     return t;
 32 }
 33 
 34 //查找函数,其中,elem表示要查找的数据元素的值
 35 int selectTable(table t, int elem)
 36 {
 37     for(int i=0; i<=t.length; i++)
 38     {
 39         if(t.head[i]==elem)
 40         {
 41             return i+1;
 42         }
 43     }
 44 
 45     return -1;//查找失败,返回-1
 46 }
 47 
 48 //更改函数,其中,elem为要更改的元素,newElem为新的数据元素
 49 table amendTable(table t, int elem, int newElem)
 50 {
 51     int add = selectTable(t,elem);
 52     t.head[add-1]=newElem;//由于返回的是元素在顺序表中位置,所以-1是该元素在数组中的下标
 53     return t;
 54 }
 55 
 56 //插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
 57 table addTable(table t,int elem,int add)
 58 {
 59     //判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况))
 60     //或者插入的位置本身不存在,程序作为提示并自动退出
 61     if(add>t.length+1 || add < 1)
 62     {
 63         perror("Position error ");
 64         return t;
 65     }
 66 
 67     //做插入操作时,首先需要看顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请
 68     if(t.length == t.size)
 69     {
 70         t.head=(int*)realloc(t.head,(t.size+1)*sizeof(int));
 71         if(!t.head)
 72         {
 73             perror("realloc error");
 74             return t;
 75         }
 76 
 77         t.size+=1;
 78     }
 79 
 80     //插入操作,需要将从插入位置开始的后续元素,逐个后移
 81     for(int i=t.length-1; i>=add-1; i--)
 82     {
 83         t.head[i+1]=t.head[i];
 84     }
 85 
 86     //后移完成,直接将所需插入元素,添加到顺序表的相应位置
 87     t.head[add-1] = elem;
 88     //由于添加了元素,所以长度+1
 89     t.length++;
 90     return t;
 91 }
 92 
 93 table delTable(table t,int add)
 94 {
 95     if(add > t.length || add < 1)
 96     {
 97         perror("del position error");
 98         exit(0);
 99     }
100 
101     for(int i=add; i<t.length; i++)
102     {
103         t.head[i-1] = t.head[i];
104     }
105     t.length--;
106     return t;
107 }
108 
109 void displayTable(table t)
110 {
111     for(int i=0; i<=t.length-1; i++)
112     {
113         printf("%d\t",t.head[i]);
114     }
115     printf("\n");
116 }
117 
118 int main(void)
119 {
120     table t1=initTable();
121     for(int i=1; i<=Size; i++)
122     {
123         t1.head[i-1]=i;
124         t1.length++;
125     }
126 
127     printf("Original seq table :\n");
128     displayTable(t1);
129 
130     for(int i=1; i<=5; i++)
131     {
132         printf("Insert elem 5 in 2nd position :\n");
133         t1=addTable(t1,5,2);
134         displayTable(t1);
135     }
136 
137     printf("Del elem 1 :\n");
138     t1=delTable(t1,1);
139     displayTable(t1);
140 
141     printf("Insert elem 5 in 2nd position :\n");
142     t1=addTable(t1,5,2);
143     displayTable(t1);
144 
145     printf("Find the position of the elem 3 :\n");
146     int add = selectTable(t1,3);
147     printf("%d\n",add);
148 
149     printf("Replace the elem 3 by 6 :\n");
150     t1=amendTable(t1, 3, 6);
151     displayTable(t1);
152 
153     return 0;
154 }

 

posted @ 2018-06-20 16:24  hello,123456  阅读(226)  评论(0编辑  收藏  举报