C语言中的数据插入的方法思路

今天就谈谈数据结构中的顺序表的代码实现中的小细节(算是编程的一种思路),对我而言,编程的语法,规则...=除了这些,我认为还很重要的就是编程的思路!有一个清晰的思路对编程的进程就加上了推进器。
好了,不多bb,直接上代码:
 1	#include<stdio.h>//顺序表的练习
 2	#include<stdlib.h>
 3	#include<time.h>
 4	#define MY_SUCCEED 1
 5	#define MY_FAILED  2
 6	#define MY_EXIST   3
 7	#define MY_NOEXIST 4
 8	#define MY_EMPTY   5
 9	#define MY_NOEMPTY 6
10	#define MY_FULL    7
11	#define MY_NOFULL  8
12	#define MY_ILL_POS 9
13	int myerrno;
14	int len;
15	void my_perror(void)
16	{
17		switch(myerrno)
18		{
19			case MY_SUCCEED:
20				printf("Info:操作成功\n");
21				break;
22			case MY_FAILED:
23				printf("Info:操作失败\n");
24				break;
25			case MY_EXIST:
26				printf("Info:顺序表存在\n");
27				break;
28			case MY_NOEXIST:
29				printf("Info:顺序表不存在\n");
30				break;
31			case MY_EMPTY:
32				printf("Info:顺序表空的\n");
33				break;
34			case MY_NOEMPTY:
35				printf("Info:顺序表不是空的\n");
36			case MY_ILL_POS:
37				printf("Info:输入的pos值非法\n");
38				break;
39			case MY_FULL:
40				printf("Info:表是满的啦\n");
41				break;
42			case MY_NOFULL:
43				printf("Info:表不是满的\n");
44			defalut:
45				printf("Info:未知错误\n");
46		}
47	}
48	typedef int datatype;
49	typedef struct list
50	{
51		int last;//位置下标
52		datatype data[0];//这是一个动态数组,要申请空间来给data[0]这个数组
53	
54	}sqlite_t;
55	
56	int seq_create(sqlite_t **q, int len)
57	{	
58		*q = malloc(sizeof(int) + sizeof(datatype)*len);//申请顺序表结构体空间
59		if(*q == NULL)
60		{
61			return MY_FAILED;
62		}
63		//初始化
64		(*q)->last = -1;
65		return MY_SUCCEED;
66		}
67	int seq_insert_end(sqlite_t *q,datatype value)
68	{
69		myerrno = seql_full(q);
70		if(myerrno == MY_FULL)
71		{
72			return myerrno;
73		}
74		q->data[q->last+1] = value;
75		q->last++;
76		return MY_SUCCEED;
77	}
78	int seql_full(sqlite_t *q)
79	{
80		//判断满的条件(判断是否存在)
81		myerrno = seql_exist(q);
82		if(MY_EXIST != myerrno)
83		{
84			return myerrno;
85		}
86		return (q->last == len - 1)?MY_FULL:MY_NOFULL;
87	}
88	int seql_exist(sqlite_t *q)
89	{
90		return (NULL == q)?MY_NOEXIST:MY_EXIST;
91	}
92	int seq_printf(sqlite_t *q,int len)
93	{
94		int i = 0;
95		for(i = 0;i <= q->last;i++)
96		{
97			printf("%d  ",q->data[i]);
98		}
99		printf("\n");

100 return MY_SUCCEED;
101 }
102 int seq_delete(sqlite_t *q)
103 {
104 q->last–;
105 }
106 int seq_insert_mid(sqlite_t *q,int pos,datatype value)
107 {
108 int i = q->last;
109 for(i = q->last;i > pos; i–)
110 {
111 if(i != pos)
112 {
113 q->data[i+1] = q->data[i];
114 }
115 }
116 q->data[pos] = value;
117 q->last++;
118 return MY_SUCCEED;
119 }
120 int main(int argc, const char *argv[])
121 {
122 len = 10;
123 printf("=开始创建顺序表=\n");
124 sqlite_t *q = NULL;
125 myerrno = seq_create(&q, len);
126 if(myerrno == MY_SUCCEED)
127 {
128 printf("=顺序表创建成功===\n");
129 }
130 else
131 {
132 printf("=顺序表创建失败===\n");
133 }
134
135 int i = 0;
136 datatype temp = 0;
137 srand(time(NULL));
138 for(i = 0;i < 100;i++)
139 {
140 temp = rand()%100;
141 myerrno = seq_insert_end(q,temp);
142 if(myerrno != MY_SUCCEED)
143 {
144 my_perror();
145 printf(“插入数据失败\n”);
146 break;
147 }
148 else
149 {
150 printf(“No.%d插入数据%d成功\n”,i,temp);
151 }
152 }
153 myerrno = seq_printf(q,len);
154 if(myerrno == MY_SUCCEED)
155 {
156 printf("=打印顺序表成功=\n");
157 }
158 else
159 {
160 my_perror();
161 printf("=打印数据表失败=\n");
162 }
163 seq_delete(q);
164 seq_printf(q,len);
165 myerrno = seq_insert_mid(q,2,120);
166 if(myerrno == MY_SUCCEED)
167 {
168 printf("=中间插入成功=\n");
169 }
170 else
171 {
172 printf("=中间插入失败=\n");
173 }
174 seq_printf(q,len);
175 return 0;
176 }
这是我还没完成的顺序表代码的实现.但是不影响我写的内容。在我初学C语言的时候就遇见了用代码实现数据的中间插入(数组)。那时候简单的思路就是用数组A[]复制你插入位置后面的所有数据,再用数组B[]将插入数据以前的(包括插入的数据)一起复制,再将这两个数组一起赋值给第三个数组C[]。不得不说这是一个笨方法。在学会指针后,用指针的方法访问数据的地址,实现数据的搬运。这就是我想说的“思路”。(我是一个初学者,写这些是增强我的印象,有认为我不对的,谢绝访问)好了,进入正题:中间插入数据的方式我们往往会有疑问,怎么将数据插入,而后面的数据还能自动向后移。ok—>>>那就是,自己先定义一个指针,指向我们的最后一个数据,让最后一个数据开始向后一个位置移动,倒数第二个数据移到最后一个位置,倒数第三个移动到倒数第二个位置…以此类推。。。说起来简单,代码有该怎么写呢!》》》》来,翠花,上酸菜1
int seq_insert_mid(sqlite_t *q,int pos,datatype value)
107 {
108 int i = q->last;//q->last就是子最后的位置
109 for(i = q->last;i > pos; i–)
110 {
111 if(i != pos)//pos就是我们插入的位置
112 {
113 q->data[i+1] = q->data[i];//数据开始搬运
114 }
115 }
116 q->data[pos] = value;//value是插入的值
117 q->last++;
118 return MY_SUCCEED;
119 }
ok.今天就分享到这!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值