鱼C论坛

 找回密码
 立即注册
查看: 2007|回复: 4

[已解决]求助怎么才能把结构体数组调到函数里?

[复制链接]
发表于 2019-2-12 11:49:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

struct staticLinkList{
        int data;
        int cur;
}SLL[MAX];

int init(struct staticLinkList);
int Malloc_SLL(struct staticLinkList);
int insert(struct staticLinkList,int n,int m);
int del(struct staticLinkList,int n);
int Free(struct staticLinkList,int k);

int main(void){
        int op,i,j;
        printf("请选择需要的操作:\n");
        printf("1 初始化静态链表\n2 插入元素\n 3删除元素\n4 退出\n");
        scanf("%d,&op");
        switch(op){
                case 1: init(SLL[MAX]);break;
                case 2: printf("请输入要插入的位置与数字:");scanf("%d%d",&i,&i);insert(SLL[MAX],i,j);break;
                case 3: printf("请输入要删除的元素的位置:");scanf("%d",&i);del(SLL[MAX],i);break;
                case 4: exit(1);
        return 0;
}

int init(struct staticLinkList SLL){
        int i;
        for(i = 0;i < MAX - 1;i++){
                SLL[i].data = 0;
                SLL[i].cur = i + 1;
        }
        SLL[MAX - 1].cur = 0;
        return 1;
}
int Malloc_SLL(struct staticLinkList SLL){
        int f; // 接收备用链表的起始位置
        f = SLL[0].cur;
        if(SLL[0].cur ){
                SLL[0].cur = SLL[f].cur;        
        }
        return f;
}
int insert(struct staticLinkList SLL,int n,int m){
        int f = Malloc_SLL(SLL);
        SLL[f].data = n;
        int s = MAX - 1,i;
        for(i = 0;i < m - 1;i++){
                s = SLL[s].cur;
        }
        SLL[f].cur = SLL[s].cur;
        SLL[s].cur = f;
        return 1;
}
int del(struct staticLinkList SLL,int n){
        int s = MAX - 1,i,k;
        for(i = 0;i < n - 1;i++){
                s = SLL[s].cur;
        }
        k = SLL[s].cur 
        SLL[s].cur = SLL[k].cur;
        Free(SLL,k);
        return 1;
}
int Free(struct staticLinkList SLL,int k){
        SLL[k].cur = SLL[0].cur;
        SLL[0].cur = k;
        
        return 1;
}
[Error] subscripted value is neither array nor pointer nor vector
请问这个错误是怎么一回事?
最佳答案
2019-2-12 16:38:35
本帖最后由 jackz007 于 2019-2-12 16:57 编辑

        代码问题颇多,现在已经调通,功能细节问题楼主可以自行斟酌修改。
#include  <stdio.h>
#include  <stdlib.h>

#define MAX 100

struct staticLinkList{
        int data ;
        int cur  ;
}SLL[MAX]        ;

int init(struct staticLinkList SLL[]){
        int i;
        for(i = 0;i < MAX - 1;i++){
                SLL[i].data = 0;
                SLL[i].cur = i + 1;
        }
        SLL[MAX - 1].cur = 0;
        return 1;
}

int Malloc_SLL(struct staticLinkList SLL[]){
        int f                                         ; // 接收备用链表的起始位置
        f = SLL[0] . cur                              ;
        if(SLL[0] . cur ) SLL[0] . cur = SLL[f] . cur ;     
        return f;
}

int insert(struct staticLinkList SLL[] , int n , int m){
        int f = Malloc_SLL(SLL)                        ;
        SLL[f] . data = n                              ;
        int s = MAX - 1 , i                            ;
        for(i = 0 ; i < m - 1 ; i ++) s = SLL[s] . cur ;
        SLL[f] . cur = SLL[s] . cur                    ;
        SLL[s] . cur = f                               ;
        return 1                                       ;
}

int Free(struct staticLinkList SLL[] , int k){
        SLL[k] . cur = SLL[0] . cur ;
        SLL[0] . cur = k            ;
        return 1                    ;
}

int del(struct staticLinkList SLL[] , int n){
        int s = MAX - 1 , i , k                        ;
        for(i = 0 ; i < n - 1 ; i ++) s = SLL[s] . cur ;
        k = SLL[s] . cur                               ;
        SLL[s] . cur = SLL[k] . cur                    ;
        Free(SLL , k)                                  ;
        return 1                                       ;
}

int main(void){
        int op , i , j                                                                                                         ;
        bool f                                                                                                                 ;
        f = true                                                                                                               ;
        while(f) {
                printf("请选择需要的操作:\n")                                                                                 ;
                printf("1 初始化静态链表\n2 插入元素\n3 删除元素\n4 显示\n5 退出\n")                                           ;
                scanf("%d" , & op)                                                                                             ;
                switch(op){
                        case 1: init(SLL) ; break                                                                              ;
                        case 2: printf("请输入要插入的位置与数字:") ; scanf("%d%d" , & i , & j) ; insert(SLL , i , j) ; break ;
                        case 3: printf("请输入要删除的元素的位置:") ; scanf("%d" , & i) ; del(SLL , i) ; break                ;
                        case 4: for(i = 0 ; i < MAX ; i ++) printf("%2d - %2d\n" , SLL[i] . data , SLL[i] . cur) ; break       ;
                        case 5: f = false                                                                                      ;
                }
        }
        return 0                                                                                                               ;
}

        此外,建议楼主最好不要使用 Free() 这样的函数名,容易与系统函数混淆。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-12 12:27:53 | 显示全部楼层
形参中的SLL并不是你初始化的SLL
用指针形式来作为形参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-12 16:38:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-2-12 16:57 编辑

        代码问题颇多,现在已经调通,功能细节问题楼主可以自行斟酌修改。
#include  <stdio.h>
#include  <stdlib.h>

#define MAX 100

struct staticLinkList{
        int data ;
        int cur  ;
}SLL[MAX]        ;

int init(struct staticLinkList SLL[]){
        int i;
        for(i = 0;i < MAX - 1;i++){
                SLL[i].data = 0;
                SLL[i].cur = i + 1;
        }
        SLL[MAX - 1].cur = 0;
        return 1;
}

int Malloc_SLL(struct staticLinkList SLL[]){
        int f                                         ; // 接收备用链表的起始位置
        f = SLL[0] . cur                              ;
        if(SLL[0] . cur ) SLL[0] . cur = SLL[f] . cur ;     
        return f;
}

int insert(struct staticLinkList SLL[] , int n , int m){
        int f = Malloc_SLL(SLL)                        ;
        SLL[f] . data = n                              ;
        int s = MAX - 1 , i                            ;
        for(i = 0 ; i < m - 1 ; i ++) s = SLL[s] . cur ;
        SLL[f] . cur = SLL[s] . cur                    ;
        SLL[s] . cur = f                               ;
        return 1                                       ;
}

int Free(struct staticLinkList SLL[] , int k){
        SLL[k] . cur = SLL[0] . cur ;
        SLL[0] . cur = k            ;
        return 1                    ;
}

int del(struct staticLinkList SLL[] , int n){
        int s = MAX - 1 , i , k                        ;
        for(i = 0 ; i < n - 1 ; i ++) s = SLL[s] . cur ;
        k = SLL[s] . cur                               ;
        SLL[s] . cur = SLL[k] . cur                    ;
        Free(SLL , k)                                  ;
        return 1                                       ;
}

int main(void){
        int op , i , j                                                                                                         ;
        bool f                                                                                                                 ;
        f = true                                                                                                               ;
        while(f) {
                printf("请选择需要的操作:\n")                                                                                 ;
                printf("1 初始化静态链表\n2 插入元素\n3 删除元素\n4 显示\n5 退出\n")                                           ;
                scanf("%d" , & op)                                                                                             ;
                switch(op){
                        case 1: init(SLL) ; break                                                                              ;
                        case 2: printf("请输入要插入的位置与数字:") ; scanf("%d%d" , & i , & j) ; insert(SLL , i , j) ; break ;
                        case 3: printf("请输入要删除的元素的位置:") ; scanf("%d" , & i) ; del(SLL , i) ; break                ;
                        case 4: for(i = 0 ; i < MAX ; i ++) printf("%2d - %2d\n" , SLL[i] . data , SLL[i] . cur) ; break       ;
                        case 5: f = false                                                                                      ;
                }
        }
        return 0                                                                                                               ;
}

        此外,建议楼主最好不要使用 Free() 这样的函数名,容易与系统函数混淆。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-12 19:13:01 | 显示全部楼层
jackz007 发表于 2019-2-12 16:38
代码问题颇多,现在已经调通,功能细节问题楼主可以自行斟酌修改。

好的,感谢指正。我下次会注意的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-12 19:15:12 | 显示全部楼层
BngThea 发表于 2019-2-12 12:27
形参中的SLL并不是你初始化的SLL
用指针形式来作为形参

我想大佬应该能看出这个是静态链表把?静态链表不就是给没有指针的语言用的么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 14:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表