线性表的链式存储实现

线性表的链式存储实现
问题相关代码,请勿粘贴截图
#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;
}

运行结果及报错内容


)

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

想要程序运行成功

这段代码的问题在表的创建(尾插法) 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;
}

学的不错啊,链表写挺好