常用数据结构代码示例

线性表

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 #define MAXSIZE 20        //存储空间大小
  5 
  6 typedef int data_t;
  7 
  8 //线性表结构
  9 typedef struct
 10 {
 11     data_t data[MAXSIZE];        //数组,存储数据元素
 12     int len;                //线性表长度(从 1 开始)
 13 }sqlist;
 14 
 15 
 16 //创建线性表
 17 sqlist* create_sqlist()
 18 {
 19     sqlist* L = (sqlist*)malloc(sizeof(sqlist));
 20     if (L == NULL)
 21     {
 22         perror("malloc");
 23         return NULL;
 24     }
 25     L->len = 0;
 26     return L;
 27 }
 28 
 29 
 30 //初始化线性表
 31 int init_sqlist(sqlist* L)
 32 {
 33     L->len = 0;        //初始化为 0,当增加元素时从 1 开始计数
 34     return 1;
 35 }
 36 
 37 
 38 //线性表长度
 39 int length_sqlist(sqlist* L)
 40 {
 41     return L->len;
 42 }
 43 
 44 
 45 //返回第 i 个位置的元素(按位置查找)
 46 int get_elem(sqlist* L, int i)
 47 {
 48     if (L->len == 0 || i < 1 || i > L->len)
 49         return -1;
 50     data_t data = L->data[i - 1];
 51     return data;
 52 }
 53 
 54 
 55 //返回线性表中与给定值相等的元素的位置(按值查找)
 56 int get_locate(sqlist* L, data_t data)
 57 {
 58     //线性表为空
 59     if (L->len == 0)
 60         return -1;
 61 
 62     //遍历查找
 63     int i = 0;        //i 为下表,返回 i+1
 64     while (i < L->len)
 65     {
 66         if (L->data[i] == data)
 67             return i + 1;
 68         ++i;
 69     }
 70     //遍历完整个线性表都没有找到
 71     if (i >= L->len)
 72         return -1;
 73 }
 74 
 75 
 76 //插入元素
 77 int insert_elem(sqlist* L, int loca, data_t data)
 78 {
 79     if (L->len == MAXSIZE)    //线性表已满
 80         return -1;
 81     if (loca < 1 || loca > L->len + 1)    //可以插到最后一个元素的后面,所以插入的位置可以等于线性表长度+
 82         return -1;
 83 
 84     //开始插入
 85     for (int i = L->len - 1; i >= loca - 1; --i)    //len 和 loca 都是从 1 开始的,但是 i 是下标,所以 len 和 loca 都要减 1
 86     {
 87         L->data[i + 1] = L->data[i];
 88     }
 89     L->data[loca - 1] = data;        //插入新元素
 90     ++L->len;
 91 
 92     return 1;
 93 }
 94 
 95 
 96 //删除元素(按位置删除)
 97 int delete_elem(sqlist* L, int loca)
 98 {
 99     if (L->len == 0)
100         return -1;
101     if (loca < 1 || loca > L->len)
102         return -1;
103 
104     //开始删除
105     for (int i = loca; i < L->len; ++i)        //将该位置(从 0 开始)后面的数依次前移
106         L->data[i - 1] = L->data[i];
107     L->len--;
108 
109     return 1;
110 }
111 
112 //修改元素(按位置查找)
113 int change_elem(sqlist* L, int loca, data_t data)
114 {
115     if (L->len == 0)
116         return -1;
117     if (loca < 1 || loca > L->len)
118         return -1;
119 
120     //开始修改
121     L->data[loca - 1] = data;
122 
123     return 1;
124 }
125 
126 
127 //打印线性表
128 void show_sqlist(sqlist* L)
129 {
130     for (int i = 0; i < L->len; ++i)
131         printf("%d ", L->data[i]);
132     printf("\n");
133 }
134 
135 
136 
137 int main()
138 {
139     int i;        //下标
140     int len;          //长度
141 
142     //创建线性表
143     sqlist* L = create_sqlist();
144 
145     //线性表的长度
146     printf("新建线性表的长度:len = ");
147     len = length_sqlist(L);
148     printf("%d\n", len);
149 
150     //在头位置插入
151     printf("在第一个位置插入5个数:");
152     for (i = 1; i <= 5; ++i)
153         insert_elem(L, 1, i);
154 
155     //打印
156     show_sqlist(L);
157 
158     //求长度
159     printf("插入5个元素后的线性表长度:len = ");
160     len = length_sqlist(L);
161     printf("%d\n", len);
162 
163     //按位置查找(从 1 开始)
164     int elem = get_elem(L, 3);
165     printf("第 3 个位置的元素为:%d\n", elem);
166 
167     //按值查找
168     int loca = get_locate(L, 4);
169     printf("4 在第 %d 个位置\n", loca);
170 
171     //删除元素
172     delete_elem(L, 1);
173     printf("删除第 1 个元素:");
174     show_sqlist(L);
175 
176     //修改元素
177     printf("将第 2 个位置的数据改为 100:");
178     change_elem(L, 2, 100);
179     show_sqlist(L);
180 
181 
182     return 0;
183 }

链表

猜你喜欢

转载自www.cnblogs.com/moxiaoyu557/p/12349279.html
今日推荐