m0_67949079 2022-03-11 09:56 采纳率: 40%
浏览 32
已结题

请问各位,下面的这个代码有啥问题啊 我想实现c语言顺序链式表的增删减查,但是不知道哪一步错了,出不了结果,卡了一个多小时了

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图

#include<stdio.h>
#include<stdlib.h>
typedef int Az;
typedef struct man {
int data;
struct man size;
}List;
int main()
{List createList();
struct man
createNode();
List find(List l,int x);
List insert(List l,int x,int i);
Az cha(List l,int p);
bool ListDelete_L(List L,int i,int e);
int len(List l);
List k,t;
int e;
int v,m,s,n,h,y,i,f,b;
createList();
k=createNode();
t=k;
printf("你想进行什么操作?");
printf("增输入2,删输入3,检输入4,查输入5,结束输入0");
scanf("%d",&v);
while(v)
{
if(v==2)
{printf("请输入你要插入的数字:");
scanf("%d",&n);
printf("请输入你要插入的位置:");
scanf("%d",&h);
insert(k,n,h);
}
if(v==3)
{printf("请输入你要删除的位置:");
scanf("%d",&y);
for(i=0;i<=y;i++)
t=t->size;
ListDelete_L (k,y,t->data);
}
if(v==4)
{printf("请输入你要查询的数字:");
scanf("%d",&m);
find(k,m);
}
if(v==5)
{printf("请输入你要查询的位置:");
scanf("%d",&m);
cha(k,m) ;
}
printf("请再次输入数字:");
scanf("%d",&v);
for(e=0;e<=99;e++)
{t=k;
printf(" %d",t->data);
t=t->size;
}}
printf("该列表的长度为:%d",len(k));
return 0;
}
List createList()
{struct man
headNode;
headNode = (struct man*)malloc(sizeof(struct man));
headNode->size = NULL;
return headNode;
}
struct man* createNode()
{int i;
struct man* newNode = (struct man*)malloc(sizeof(struct man));
for(i=0;i<=99;i++)
{
newNode->data = i;
newNode=newNode->size;
}
newNode->size = NULL;
return newNode;
}

int len(List l)
{
List p;
int cut=0;
p=l;
while(p)
{p=p->size;
cut++;
}
return cut;
}
List find(List l,int x)
{int i;
List p=l;
for(i=0;i<=99;i++)
{
if(p&&p->data!=x) p=p->size;}
if(p) return p;
else return NULL;
}
Az cha(List l,int p)
{List m;
int cnt=1;
m=l;
while(m&&cnt<p){
m=m->size;
cnt++;
}
if((cnt==p)&&m)
return m->data;
else return -1;
}
List insert(List l,int x,int i)
{
List tmp,pre;
tmp=(List)malloc(sizeof(struct man));
tmp->data=x;
if(i==1){
tmp->size=l;
return tmp;
}
else{
int cnt=1;
pre=l;
while(pre&&cnt<i-1)
{
pre=pre->size;
cnt++;
}
if(pre==NULL||cnt!=i-1)
{
printf("插入参数错误");
free(tmp);
return NULL;
}
else {
tmp->size=pre->size;
pre->size=tmp;
return l;
}
}
}
bool ListDelete_L (List L,int i,int e)
{ int j;
List p,q;
p=L ;
j=0;
while (p->size && j<i-1)
{
p=p->size;
j++;
}
if (!(p->size)||j>i-1)
return false;
else {
q=p->size;
e=q->data;
p->size=q->size;
free(q);
return true;
}
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-03-11 15:28
    关注

    修改如下,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    typedef int Az;
    typedef struct man {
        int    data;
        struct man* size;
    }List;
    int main()
    {
        List* createList();
        struct man* createNode();
        List* find(List* l, int x);
        List* insert(List* l, int x, int i);
        Az cha(List* l, int p);
        List* ListDelete_L(List * L, int i, int* e);
        int len(List* l);
        List *k, *t;
        int e;
        int v, m, s, n, h, y, i, f, b;
        k = createList();
        k->size = createNode();
        t = k;
        printf("你想进行什么操作?");
        printf("增输入2, 删输入3, 按数字检输入4, 按位置查输入5, 结束输入0\n");
        scanf("%d", &v);
        while (v)
        {
            if (v == 2)
            {
                printf("请输入你要插入的数字:");
                scanf("%d", &n);
                printf("请输入你要插入的位置:");
                scanf("%d", &h);
                k = insert(k, n, h);
            }
            if (v == 3)
            {
                printf("请输入你要删除的位置:");
                scanf("%d", &y);
                //for (i = 0; i <= y; i++)
                //    t = t->size;
                k = ListDelete_L(k, y, &e);
                if (e < 0)
                    printf("删除未成功\n");
                else
                    printf("删除数:%d\n", e);
            }
            if (v == 4)
            {
                printf("请输入你要查询的数字:");
                scanf("%d", &m);
                t = find(k, m);
                if (!t)
                    printf("未找到查询的数字.\n");
                else
                    printf("%d\n", t->data);
            }
            if (v == 5)
            {
                printf("请输入你要查询的位置:");
                scanf("%d", &m);
                e = cha(k, m);
                if (e < 0)
                    printf("未找到查询的位置\n");
                else
                    printf("%d\n", e);
            }
            t = k;
            while(t->size)
            {
                printf(" %d", t->size->data);
                t = t->size;
            }
            printf("\n请再次输入数字:");
            scanf("%d", &v);
        }
        printf("该列表的长度为:%d", len(k));
        return 0;
    }
    List *createList()
    {
        struct man *headNode;
        headNode = (struct man*)malloc(sizeof(struct man));
        headNode->size = NULL;
        return headNode;
    }
    struct man* createNode()
    {
        int i;
        struct man* p = NULL, * q = NULL;
        for (i = 0; i <= 99; i++)
        {
            struct man* newNode = (struct man*)malloc(sizeof(struct man));
            newNode->data = i;
            newNode->size = NULL;
            if (p == NULL)
                p = newNode;
            else
                q->size = newNode;
            q = newNode;
        }
        return p;
    }
    
    int len(List* l)
    {
        List* p;
        int cut = 0;
        p = l;
        while (p->size)
        {
            p = p->size;
            cut++;
        }
        return cut;
    }
    List* find(List* l, int x)
    {
        int i;
        List* p = l;
        while (p->size && p->size->data != x) p = p->size;
        if (p->size) 
            return p->size;
        else 
            return NULL;
    }
    Az cha(List* l, int p)
    {
        List* m;
        int cnt = 0;
        m = l;
        while (m->size && cnt < p) {
            m = m->size;
            cnt++;
        }
        if (cnt == p)
            return m->data;
        else 
            return -1;
    }
    List* insert(List* l, int x, int i)
    {
        List *tmp, *pre;
        tmp = (List*)malloc(sizeof(struct man));
        tmp->data = x;
        if (i <= 1) {
            tmp->size = l->size;
            l->size = tmp;
            //return tmp;
        }
        else {
            int cnt = 0;
            pre = l;
            while (pre->size && cnt < i)
            {
                pre = pre->size;
                cnt++;
            }
            if (pre == NULL || cnt != i)
            {
                printf("插入参数错误\n");
                free(tmp);
                //return NULL;
            }
            else {
                tmp->size = pre->size;
                pre->size = tmp;
                //return l;
            }
        }
        return l;
    }
    List*  ListDelete_L(List* L, int i, int *e)
    {
        List* tmp, * pre;
        if (i <= 1) {
            tmp = L->size;
            (*e) = tmp->data;
            L->size = tmp->size;
            free(tmp);
        }
        else {
            int cnt = 1;
            pre = L;
            while (pre->size && cnt < i)
            {
                pre = pre->size;
                cnt++;
            }
            if (pre->size == NULL)
            {
                printf("删除参数错误\n");
                (*e) = -1;
            }
            else {
                tmp = pre->size;
                (*e) = tmp->data;
                pre->size = tmp->size;
                free(tmp);
            }
        }
        return L;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月11日

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算