C语言数据结构求解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言数据结构求解相关的知识,希望对你有一定的参考价值。
23题,求详细解答过程
方法很多,可以在插入数据后再对线性表进行删改,也可以在插入前进行处理。
我这里代码是在插入前处理。
(注释掉的函数int getPNUM(struct Sqlist *st,int n);是我预留的,题2如果你想改成插入后,再对线性表素数进行查找,可以用这个函数。否则可以删除)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LIST_INIT_SIZE 800
struct Sqlist
int *elem;
int length;
int listsize;
;
int insert2List(struct Sqlist *st,int num,int inx);//向线性表第inx个元素的位置插入一个元素。成功返回1,失败返回0
int findNum(struct Sqlist *st,int num);//在线性表中查找指定数字,存在返回1,不存在返回0
//int getPNUM(struct Sqlist *st,int n);//查找素数,返回第几n个素数的下标。未找到返回-1
void showList(struct Sqlist *st);//打印线性表
void clearList(struct Sqlist *st);//清空线性表
int main()
int i,k,nums[LIST_INIT_SIZE],n,num,cnt,flag;
struct Sqlist st=nums,0,LIST_INIT_SIZE;
srand(time(NULL));
//--------------题1-----------------------------------------------------------------------
n=100;
k=1;
printf("1、随机生成100个【100,200】之间的随机数,去除重复并保存到线性表\\n");
while(n--)
num=rand()%101+100;
printf("--%3d产生随机数%d\\n",k++,num);
if(findNum(&st,num))
printf("该数字已在线性表中存在,重复去除\\n");
else
if(insert2List(&st,num,st.length+1))
printf("该随机值已保存到线性表尾部\\n");
else
printf("异常!插入失败!\\n");
return 1;
showList(&st);
clearList(&st);
//-------------题2----------------------------------------------------------------
n=20;
cnt=0;
k=1;
printf("1、随机生成20个【1,200】之间的随机数,在第一个素数后插入1个0,第二个素数后插入2个0,以此类推,最后输出所有元素\\n");
while(n--)
num=rand()%200+1;
printf("--%3d产生随机数%d\\n",k++,num);
flag=1;
for(i=2;i<num;i++)
if(num%i==0)
flag=0;
break;
if(flag)
cnt++;
printf("该随机值是一个素数,在其尾部插入%d个0\\n",cnt);
for(i=0;i<cnt;i++)
num*=10;
printf("该随机值变更为%d\\n",num);
if(insert2List(&st,num,st.length+1))
printf("该随机值已保存到线性表尾部\\n");
else
printf("异常!插入失败!\\n");
return 1;
showList(&st);
return 0;
void clearList(struct Sqlist *st)//清空线性表
st->length=0;
printf("线性表数据已清除\\n");
void showList(struct Sqlist *st)//打印线性表
int i;
printf("当前线性表的数据为:\\n");
for(i=0;i<st->length;i++)
printf("%d ",st->elem[i]);
printf("\\n");
int findNum(struct Sqlist *st,int num)//在线性表中查找指定数字,存在返回1,不存在返回0
int *p=st->elem;
while(p<=&st->elem[st->length-1])
if(*p++==num)
return 1;
return 0;
/*
int getPNUM(struct Sqlist *st,int n)//查找素数,返回第几n个素数的下标。未找到返回-1
int i,j,flag,cnt=0;
for(i=0;i<st->length;i++)
flag=1;
for(j=2;j<st->elem[i];j++)
if(st->elem[i]%j==0)
flag=0;
break;
if(flag)
cnt++;
if(cnt==n)
return i;
return -1;
*/
int insert2List(struct Sqlist *st,int num,int inx)//向线性表第inx个元素的位置插入一个元素。成功返回1,失败返回0
int i;
if(st->length==st->listsize)
printf("线性表已满,插入失败!\\n");
return 0;
if(inx<1 && inx>st->length+1)
printf("插入位置无效!线性表当前数据长度为%d,插入位置必须大于1且不能大于%d!\\n",st->length,st->length+1);
return 0;
for(i=st->length;i>=inx;i--)
st->elem[i]=st->elem[i-1];
st->elem[inx-1]=num;
st->length++;
return 1;
参考技术A如上图,把k位置的数据删除后,需要把k后面的元素逐个向前移动一次。
一共是n个元素,k前面(包括k)一共是k个元素,剩下需要移动的就是n-k个元素。答案选A
本回答被提问者采纳 参考技术B 需要移动k+1、k+2。。。一直到n的元素,所以次数是n-(k+1)+1追问选项没有.....
追答无语。。。n-(k+1)+1 = n-k-1+1 = n-k
数据结构算法C语言实现--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介
迷宫求解:类似图的DFS。具体的算法思路可以参考书上的50、51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意。大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩。这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求。
表达式求值:
由于数据的读入是按照字符读入的,所以这个简单的小程序只能计算个位数的运算。
二.头文件
迷宫求解:
1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:zhaoyu1995.com@gmail.com 5 date:2016-6-8 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 51 9 #ifndef _3_2_MAZE_H 10 #define _3_2_MAZE_H 11 #include <cstdio> 12 #include <cstdlib> 13 #include <cstring> 14 #include "head.h" 15 #define STACK_INIT_SIZE 200//存储空间的初始分配值 16 #define STACKINCREMENT 10//存储空间分配增量 17 #define WALL -1 18 #define PATH 1 19 #define PASSED -2 20 #define UNREACHABLE -3 21 #define FINALPATH -4 22 #define NMAX 50 23 char Map[NMAX][NMAX]; 24 typedef struct{ 25 int x; 26 int y; 27 }PosType; 28 typedef struct node_1{ 29 int x, y; 30 struct node_1 *next; 31 }MazeType; 32 typedef struct{ 33 int ord;//通道块在路径上的序号 34 PosType seat;//通道块在迷宫中的位置 35 int direction;//从此通道块走向下一通道块的方向 36 }SElemType; 37 typedef struct{ 38 SElemType *base;//在栈构造之前和销毁之后,base 值为 NULL 39 SElemType *top;//栈顶指针 40 int stacksize;//当前已分配的存储空间,以元素为单位 41 }SqStack; 42 Status InitStack(SqStack &S) 43 { 44 //构造一个空栈 S 45 S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); 46 if (!S.base) 47 { 48 exit(OVERFLOW); 49 } 50 S.top = S.base; 51 S.stacksize = STACK_INIT_SIZE; 52 return OK; 53 }//InitStack 54 void Assign_PosType(PosType &a, PosType b) 55 { 56 a.x = b.x; 57 a.y = b.y; 58 }//Assign_PosType 59 Status Pass(PosType pos) 60 {//可能写的不对,注意 61 if (PATH == Map[pos.x][pos.y]) 62 { 63 return TRUE; 64 } 65 else 66 { 67 return FALSE; 68 } 69 }//Pass 70 void FoorPrint(PosType pos) 71 { 72 Map[pos.x][pos.y] = PASSED; 73 } 74 void Assign_SELemType(SElemType &e, int x, PosType pos, int y) 75 { 76 e.ord = x; 77 Assign_PosType(e.seat, pos); 78 e.direction = y; 79 } 80 Status Push(SqStack &S, SElemType e) 81 { 82 //插入元素 e 为新的栈顶元素 83 if (S.top - S.base >= S.stacksize) 84 {//栈满,追加存储空间 85 S.base = (SElemType *)realloc(S.base, 86 (S.stacksize+STACKINCREMENT)*sizeof(SElemType)); 87 if (!S.base) 88 { 89 exit(OVERFLOW); 90 } 91 S.top = S.base + S.stacksize; 92 S.stacksize += STACKINCREMENT; 93 } 94 //*S.top++ = e; 95 Assign_SELemType(*S.top++, e.ord, e.seat, e.direction); 96 return OK; 97 }//Push 98 PosType NextPos(PosType pos, int direction) 99 { 100 PosType temp; 101 switch (direction) 102 { 103 case 1: 104 { 105 temp.x = pos.x; 106 temp.y = pos.y+1; 107 break; 108 } 109 case 2: 110 { 111 temp.x = pos.x + 1; 112 temp.y = pos.y; 113 break; 114 } 115 case 3: 116 { 117 temp.x = pos.x; 118 temp.y = pos.y - 1; 119 break; 120 } 121 case 4: 122 { 123 temp.x = pos.x - 1; 124 temp.y = pos.y; 125 break; 126 } 127 } 128 //加一个越界检查 129 return temp; 130 } 131 Status StackEmpty(SqStack S) 132 { 133 //若 S 为空栈, 则返回 TRUE, 否则返回 FALSE 134 if (S.base == S.top) 135 { 136 return TRUE; 137 } 138 else 139 { 140 return FALSE; 141 } 142 } 143 Status Pop(SqStack &S, SElemType &e) 144 { 145 //若栈不空,则删除 S 的栈顶元素,用 e 返回其 146 //值,并返回OK;否则返回ERROR 147 if (S.top == S.base) 148 { 149 return ERROR; 150 } 151 //e = *--S.top; 152 S.top--; 153 Assign_SELemType(e, (*S.top).ord, (*S.top).seat, (*S.top).direction); 154 return OK; 155 }//Pop 156 void FootPrint(PosType pos) 157 { 158 Map[pos.x][pos.y] = PASSED; 159 } 160 void MarkPrint(PosType pos) 161 { 162 Map[pos.x][pos.y] = UNREACHABLE; 163 } 164 void MakeMap(int size) 165 { 166 memset(Map, 0, sizeof(Map)); 167 char ch; 168 getchar(); 169 for (int i = 1; i <= size; i++) 170 { 171 for (int j = 1; j <= size; j++) 172 { 173 scanf("%c", &ch); 174 if (\'X\' == ch) 175 { 176 Map[i][j] = UNREACHABLE; 177 } 178 else 179 { 180 Map[i][j] = PATH; 181 } 182 } 183 //attention \'\\n\' 184 getchar(); 185 } 186 //Print maze 187 for (int i = 1; i <= size; i++) 188 { 189 for (int j = 1; j <= size; j++) 190 { 191 if (UNREACHABLE == Map[i][j]) 192 { 193 printf("X"); 194 } 195 else 196 { 197 printf(" "); 198 } 199 } 200 printf("\\n"); 201 } 202 } 203 void PrintPath(SqStack S, int size) 204 { 205 SElemType e; 206 SqStack temp; 207 while (!StackEmpty(S)) 208 { 209 Pop(S, e); 210 Map[e.seat.x][e.seat.y] = FINALPATH; 211 } 212 for (int i = 1; i <= size; i++) 213 { 214 for (int j = 1; j <= size; j++) 215 { 216 if (UNREACHABLE == Map[i][j]) 217 { 218 printf("X"); 219 } 220 else if (FINALPATH == Map[i][j]) 221 { 222 printf("O"); 223 } 224 else 225 { 226 printf(" "); 227 } 228 } 229 printf("\\n"); 230 } 231 } 232 Status MazePath(MazeType maze, PosType start, PosType end, int size) 233 { 234 //若迷宫 maze 中存在从入口 start 到出口 end 的通道, 235 //则求得一条存放在栈中(从栈底到栈顶),并返回 TRUE, 236 //否则返回 FALSE 237 SqStack S; 238 InitStack(S); 239 //curpos = start 240 PosType curpos; 241 Assign_PosType(curpos, start);//设定当前位置为入口位置 242 int curstep = 1;//探索第一步 243 SElemType e; 244 do{ 245 if (TRUE == Pass(curpos)) 246 {//当前位置可以通过 247 FootPrint(curpos);//留下足迹 248 //e = (curstep, curpos, 1); 249 Assign_SELemType(e, curstep, curpos, 1); 250 Push(S, e);//加入路径 251 if (curpos.x == end.x && curpos.y == end.y) 252 { 253 //打印路径 254 printf("PATH EXIST\\n"); 255 PrintPath(S ,size); 256 return TRUE; 257 } 258 curpos = NextPos(curpos, 1);//下一位置是当前位置的东邻 259 curstep++;//探索下一步 260 } 261 else 262 { 263 if (!StackEmpty(S)) 264 { 265 Pop(S, e); 266 while (4 == e.direction && !StackEmpty(S)) 267 { 268 MarkPrint(e.seat); 269 Pop(S, e);//留下不能通过的标记,并退回一步 270 } 271 if (e.direction < 4) 272 { 273 e.direction++; 274 Push(S, e); 275 curpos = NextPos(e.seat, e.direction); 276 } 277 } 278 } 279 }while (!StackEmpty(S)); 280 281 } 282 #endif
表达式求值:
1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:zhaoyu1995.com@gmail.com 5 date:2016-6-8 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 53 9 #ifndef _3_2_EXPRESSION_H_ 10 #define _3_2_EXPRESSION_H_ 11 #include "head.h" 12 13 #define SElemType char 14 #define OperandType float 15 #define STACK_INIT_SIZE 100//存储空间的初始分配值 16 #define STACKINCREMENT 10//存储空间分配增量 17 typedef struct{ 18 SElemType *base;//在栈构造之前和销毁之后,base 值为 NULL 19 SElemType *top;//栈顶指针 20 int stacksize;//当前已分配的存储空间,以元素为单位 21 }SqStack_Char; 22 typedef struct{ 23 OperandType *base;//在栈构造之前和销毁之后,base 值为 NULL 24 OperandType *top;//栈顶指针 25 int stacksize;//当前已分配的存储空间,以元素为单位 26 }SqStack_Float; 27 Status InitStack_Char(SqStack_Char &S) 28 { 29 //构造一个空栈 S 30 S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); 31 if (!S.base) 32 { 33 exit(OVERFLOW); 34 } 35 S.top = S.base; 36 S.stacksize = STACK_INIT_SIZE; 37 return OK; 38 }//InitStack 39 Status InitStack_Float(SqStack_Float &S) 40 { 41 //构造一个空栈 S 42 S.base = (OperandType *)malloc(STACK_INIT_SIZE*sizeof(OperandType)); 43 if (!S.base) 44 { 45 exit(OVERFLOW); 46 } 47 S.top = S.base; 48 S.stacksize = STACK_INIT_SIZE; 49 return OK; 50 }//InitStack 51 Status Push_Char(SqStack_Char &S, SElemType e) 52 { 53 //插入元素 e 为新的栈顶元素 54 if (S.top - S.base >= S.stacksize) 55 {//栈满,追加存储空间 56 S.base = (SElemType *)realloc(S.base, 57 (S.stacksize+STACKINCREMENT)*sizeof(SElemType)); 58 if (!S.base) 59 { 60 exit(OVERFLOW); 61 } 62 S.top = S.base + S.stacksize; 63 S.stacksize += STACKINCREMENT; 64 } 65 *S.top++ = e; 66 return OK; 67 }//Push 68 SElemType GetTop_Char(SqStack_Char S) 69 { 70 //若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK; 71 //否则返回ERROR 72 if (S.top == S.base) 73 { 74 return ERROR; 75 } 76 return *(S.top - 1); 77 }//GetTop 78 Status isInOPTR(SElemType c) 79 { 80 switch (c) 81 { 82 case \'+\': 83 case \'-\': 84 case \'*\': 85 case \'/\': 86 case \'(\': 87 case \')\': 88 case \'#\': 89 { 90 return TRUE; 91 break; 92 } 93 default: 94 { 95 return FALSE; 96 break; 97 } 98 } 99 } 100 Status Push_Float(SqStack_Float &S, OperandType e) 101 { 102 //插入元素 e 为新的栈顶元素 103 if (S.top - S.base >= S.stacksize) 104 {//栈满,追加存储空间 105 S.base = (OperandType *)realloc(S.base, 106 (S.stacksize+STACKINCREMENT)*sizeof(OperandType)); 107 if (!S.base) 108 { 109 exit(OVERFLOW); 110 } 111 S.top = S.base + S.stacksize; 112 S.stacksize += STACKINCREMENT; 113 } 114 *S.top++ = e; 115 return OK; 116 }//Push 117 char Precede(SElemType a, SElemType b) 118 { 119 char R[7][7] = {{\'>\',\'>\',\'<\',\'<\',\'<\',\'&g以上是关于C语言数据结构求解的主要内容,如果未能解决你的问题,请参考以下文章
Linux C语言 C/S程序,客户端发送的数据和服务器端接收到的数据不一样,求解
数据结构算法C语言实现--- 3.2栈的应用举例:迷宫求解与表达式求值