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
3_2_maze.h

  表达式求值:

  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程序,客户端发送的数据和服务器端接收到的数据不一样,求解

基于SAT的数独游戏求解程序,求C语言代码

数据结构算法C语言实现--- 3.2栈的应用举例:迷宫求解与表达式求值

C语言问题,求解释(关于动态链表和文件写入):

c语言中,结构体初始化和数组初始化的写法是否一样的?求解,谢谢

C语言 版 数据结构