翎未眠 2022-06-09 16:55 采纳率: 50%
浏览 29
已结题

线性表的链式存储实现

线性表的链式存储实现
问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElementType;
typedef struct LNode *List;
struct LNode{
    ElementType Data;
    List Next;
};
struct LNode L;
List PtrL;
//表的创建(尾插法)
void CreateListTail(List PtrL,int m[],int n){
    List p,s;
    int i;
    PtrL=(List)malloc(sizeof(LNode));
    s=PtrL;
    for(i=0;i<n;i++){
        p=(LNode *)malloc(sizeof(LNode));
        p->Data=m[i];
        s->Next=p;
        s=p;
    }
    s->Next=NULL;
}
//求表长 
int Length(List PtrL){
    List p=PtrL;/* p指向表的第一个结点*/
    int j=0;
    while(p){
        p=p->Next;
        j++;/* 当前p指向的是第 j 个结点*/
    } 
    return j;
}
//获取元素
Status Get(List PtrL,int i,ElementType *e){
    int j;
    List p;
    p=PtrL->Next;
    j=1;
    while(p&&j<i){
        p=p->Next;
        ++j;
    }
    if(!p||j>i){
        return ERROR;
    }
    *e=p->Data;
    return OK;
}
//查找
//按序号查找 
List FindKth(int K,List PtrL){
    List p=PtrL;
    int i=1;
    while(p!=NULL&&i<K){
        p=p->Next;
        i++;
    }
    if(i==K)
    return p;/* 找到第K个,返回指针 */
    else
    return NULL;/* 否则返回空 */
}
/*
//按值查找 
List Find(ElementType X,List PtrL){
    List p=PtrL;
    while(p!=NULL&&p->Data!=X)
    p=p->Next;
    return p;
}
*/
//插入 
List Insert(ElementType X,int i,List PtrL){
    List p,s;
    if(i==1){/* 新结点插入在表头 */
        s=(List)malloc(sizeof(struct LNode));/*申请、填装结点*/
        s->Data=X;
        s->Next=PtrL;
        return s;
    }
    p=FindKth(i-1,PtrL);/* 查找第i-1个结点 */
    if(p==NULL){/* 第i-1个不存在,不能插入 */
        printf("参数i错");
        return NULL;
    }
    else{
        s=(List)malloc(sizeof(struct LNode));/*申请、填装结点*/
        s->Data=X;
        s->Next=p->Next;/*新结点插入在第i-1个结点的后面*/
        p->Next=s;
        return PtrL;
    }
}
//删除
List Delete(int i,List PtrL){
    List p,s;
    if(i==1){/* 若要删除的是表的第一个结点 */
        s=PtrL;/*s指向第1个结点*/
        if(PtrL!=NULL)
        PtrL=PtrL->Next;/*从链表中删除*/
        else
        return NULL;
        free(s);
        return PtrL;
    }
    p=FindKth(i-1,PtrL);/*查找第i-1个结点*/
    if(p==NULL){
        printf("第%d个结点不存在",i-1);
        return NULL;
    }
    else if(p->Next==NULL){
        printf("第%d个结点不存在",i);
        return NULL;
    }
    else{
        s=p->Next;/*s指向第i个结点*/
        p->Next=s->Next;/*从链表中删除*/
        free(s);/*释放被删除结点 */
        return PtrL;
    }
} 
//输出
Status Output(List PtrL)
{
    List p;
    p=PtrL->Next;
    while(p){
        printf("%d",p->Data);
        p=p->Next;
    }
    printf("\n");
}
int main(){
    int i,k,j,n,e,m[1000];
    printf("请输入要存储元素的总个数:");
    scanf("%d",&n);
    printf("请输入各个元素的值:");
    for(i=0;i<n;i++){
        scanf("%d",&m[i]);
    } 
    CreateListTail(PtrL,m,n);
    printf("此时链表的各个元素如下:\n");
    Output(PtrL);
    printf("请输入要获取第i个元素并返回到e值中(输入j的值):");
    scanf("%d",&j);
    Get(PtrL,j,&e);
    printf("此时e的值为第j个元素值:%d\n",e);
    printf("请输入在第k个元素前插入一个元素e1:");
    int e1;
    scanf("%d%d",&k,&e1);
    Insert(e1,k,PtrL);
    printf("此时链表的各元素如下:\n");
    Output(PtrL);
    printf("请输入要删除链表中的第几个元素:");
    int l;
    scanf("%d",&l);
    Delete(i,PtrL);
    printf("此时链表的各元素如下:\n");
    Output(PtrL);
    return 0;
}

运行结果及报错内容


)

我的解答思路和尝试过的方法
我想要达到的结果

想要程序运行成功

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-06-09 21:20
    关注

    这段代码的问题在表的创建(尾插法) void CreateListTail(List PtrL,int m[],int n) 函数,修改处见注释。另发现删除函数里删除第几个位置元素,最终删除的位置和输入位置的对不上,没细究,题主再调试修改下。

    #include<stdio.h>
    #include<stdlib.h>
    #define ERROR 0
    #define OK 1
    typedef int Status;
    typedef int ElementType;
    typedef struct LNode *List;
    struct LNode{
        ElementType Data;
        List Next;
    };
    struct LNode L;
    //List PtrL;  //链表指针的定义移动到主函数里,不需要全局变量
    //表的创建(尾插法)
    void CreateListTail(List* PtrL,int m[],int n){//函数修改
    //void CreateListTail(List PtrL,int m[],int n)
        List p,s;
        int i;
        (*PtrL)=(List)malloc(sizeof(LNode));// 修改
        //PtrL=(List)malloc(sizeof(LNode));
        s=(*PtrL);                          // 表创建函数修改
        //s=PtrL;
        for(i=0;i<n;i++){
            p=(LNode *)malloc(sizeof(LNode));
            p->Data=m[i];
            s->Next=p;
            s=p;
        }
        s->Next=NULL;
    }
    //求表长
    int Length(List PtrL){
        List p=PtrL;/* p指向表的第一个结点*/
        int j=0;
        while(p){
            p=p->Next;
            j++;/* 当前p指向的是第 j 个结点*/
        }
        return j;
    }
    //获取元素
    Status Get(List PtrL,int i,ElementType *e){
        int j;
        List p;
        p=PtrL->Next;
        j=1;
        while(p&&j<i){
            p=p->Next;
            ++j;
        }
        if(!p||j>i){
            return ERROR;
        }
        *e=p->Data;
        return OK;
    }
    //查找
    //按序号查找 
    List FindKth(int K,List PtrL){
        List p=PtrL;
        int i=1;
        while(p!=NULL&&i<K){
            p=p->Next;
            i++;
        }
        if(i==K)
        return p;/* 找到第K个,返回指针 */
        else
        return NULL;/* 否则返回空 */
    }
    /*
    //按值查找
    List Find(ElementType X,List PtrL){
        List p=PtrL;
        while(p!=NULL&&p->Data!=X)
        p=p->Next;
        return p;
    }
    */
    //插入 
    List Insert(ElementType X,int i,List PtrL){
        List p,s;
        if(i==1){/* 新结点插入在表头 */
            s=(List)malloc(sizeof(struct LNode));/*申请、填装结点*/
            s->Data=X;
            s->Next=PtrL;
            return s;
        }
        p=FindKth(i-1,PtrL);/* 查找第i-1个结点 */
        if(p==NULL){/* 第i-1个不存在,不能插入 */
            printf("参数i错");
            return NULL;
        }
        else{
            s=(List)malloc(sizeof(struct LNode));/*申请、填装结点*/
            s->Data=X;
            s->Next=p->Next;/*新结点插入在第i-1个结点的后面*/
            p->Next=s;
            return PtrL;
        }
    }
    //删除
    List Delete(int i,List PtrL){
        List p,s;
        if(i==1){/* 若要删除的是表的第一个结点 */
            s=PtrL;/*s指向第1个结点*/
            if(PtrL!=NULL)
            PtrL=PtrL->Next;/*从链表中删除*/
            else
            return NULL;
            free(s);
            return PtrL;
        }
        p=FindKth(i-1,PtrL);/*查找第i-1个结点*/
        if(p==NULL){
            printf("第%d个结点不存在",i-1);
            return NULL;
        }
        else if(p->Next==NULL){
            printf("第%d个结点不存在",i);
            return NULL;
        }
        else{
            s=p->Next;/*s指向第i个结点*/
            p->Next=s->Next;/*从链表中删除*/
            free(s);/*释放被删除结点 */
            return PtrL;
        }
    } 
    //输出
    Status Output(List PtrL)
    {
        List p;
        p=PtrL->Next;
        while(p){
            printf("%d ",p->Data);
            p=p->Next;
        }
        printf("\n");
    }
    int main(){
        List PtrL;  //链表指针定义移动到主函数里
        int i,k,j,n,e,m[1000];
        printf("请输入要存储元素的总个数:");
        scanf("%d",&n);
        printf("请输入各个元素的值:");
        for(i=0;i<n;i++){
            scanf("%d",&m[i]);
        } 
        CreateListTail(&PtrL,m,n);// 表创建函数修改
        printf("此时链表的各个元素如下:\n");
        Output(PtrL);
        printf("请输入要获取第i个元素并返回到e值中(输入j的值):");
        scanf("%d",&j);
        Get(PtrL,j,&e);
        printf("此时e的值为第j个元素值:%d\n",e);
        printf("请输入在第k个元素前插入一个元素e1:");
        int e1;
        scanf("%d%d",&k,&e1);
        Insert(e1,k,PtrL);
        printf("此时链表的各元素如下:\n");
        Output(PtrL);
        printf("请输入要删除链表中的第几个元素:");
        int l;
        scanf("%d",&l);
        Delete(i,PtrL);
        printf("此时链表的各元素如下:\n");
        Output(PtrL);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月9日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)