关于C语言数据结构的问题!

我的代码编译没有问题,但是运行有问题

img

img

#include
#define _CRT_SECURE_NO_WARNINGS
#include 
typedef int Element;

typedef struct Lnode
{
    Element data;
    struct Lnode* next;
}Linknode;
//头插法
void Creatlist(Linknode*& L, Element a[], int n)//n为数组a中元素的个数
{
    Linknode* s;
    L = (Linknode*)malloc(sizeof(Linknode));
    L->next = NULL;
    for (int i = 0; i < n; i++)
    {
        s = (Linknode*)malloc(sizeof(Linknode));
        s->data = a[i];
        s->next = L->next;
        L->next = s;
    }
}
//尾插法
void createlist(Linknode*& L, Element a[], int n)//n为数组a中元素的个数
{
    Linknode* s, * r;
    L = (Linknode*)malloc(sizeof(Linknode));
    r = L;
    for (int i = 0; i < n; i++)
    {
        s = (Linknode*)malloc(sizeof(Linknode));
        s->data = a[i];
        r->next = s;
        r = s;
    }
    r->next = NULL;
}

//建立一个空的链表
void initlist(Linknode*& L)
{
    L = (Linknode*)malloc(sizeof(Linknode));
    L->next = NULL;
}

//销毁链表
void destorylist(Linknode*& L)
{
    Linknode* pre = L, * p = L->next;
    while (p != NULL)
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}

//判断链表是否为空表
bool list_empty(Linknode* L)
{
    return(L->next == NULL);
}

//求链表的长度
int lengthlist(Linknode* L)
{
    int n = 0;              //n为长度
    Linknode* p = L;
    while (p->next != NULL)
    {
        n++;
        p = p->next;
    }
    return (n);
}

//输出链表
void displist(Linknode* L)
{
    Linknode* p;
    p = L;
    while (p->next != NULL)
    {
        printf("%d ", p->next->data);
        p = p->next;
    }
    printf("\n");
}

//按线性表求链表中的元素
bool getelem(Linknode* L, int i, Element& e)
{
    Linknode* p;
    int n = 0;
    p = L;
    while (p->next != NULL && n < i)
    {
        n++;
        p = p->next;
    }

    if (n == i)
    {
        e = p->data;
        return true;
    }
    else
        return false;
}

//按元素值查找
int locatelem(Linknode* L, Element e)
{
    Linknode* p;
    int i = 0;
    p = L->next;
    while (p != NULL && p->data != e)
    {
        i++;
        p = p->next;
    }
    if (p == NULL)
        return 0;
    else
        return(i);
}

//插入数据元素
bool insertelem(Linknode* L, int i, Element e)
{
    Linknode* p, * s;
    int j = 0;
    p = L->next;

    while (p != NULL && j < i - 1)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
        return false;
    else
    {
        s = (Linknode*)malloc(sizeof(Linknode));
        s->data = e;
        s->next = p->next;
        p->next = s;
        return true;
    }
}

//删除数据元素
bool deletelem(Linknode* L, int i, Element& e)
{
    Linknode* p, * q;
    int j = 0;
    p = L->next;
    if (p == NULL)
        return false;
    while (p != NULL && j < i - 1)
    {
        j++;
        p = p->next;
    }
    if (j == i - 1)
    {
        q = (Linknode*)malloc(sizeof(Linknode));
        q = p->next;
        e = q->data;
        p->next = q->next;
        free(q);
        return true;
    }
    else
    {
        return false;
    }
}
 
//将所有单链表的节点逆置
void inver(Linknode*& L)
{
    Linknode* p,*q;

    L = (Linknode*)malloc(sizeof(Linknode));
    p = L->next;
    L->next = NULL;
    while (p != NULL)
    {
        q = p->next;
        p->next = L->next;
        L->next = p;
        p = q;
    }
}

//设计一个算法,在最大值的前面插入一个值为x的节点
void inserts(Linknode* &L, int x)
{
    L = (Linknode*)malloc(sizeof(Linknode));
    Linknode* p, * pre,*q;
    Linknode* maxp , * maxpre;
    p = L->next; pre = L;
    maxp = p; maxpre = pre;
    while (p != NULL)
    {
        if (maxp->data < p->data)
        {
            maxp = p;
            maxpre = pre;
        }
        q = p;
        p = p->next;
        
    }
    q= (Linknode*)malloc(sizeof(Linknode));
    q->data = x;
    q->next = maxpre->next;
    maxpre->next = q;
}
int main()
{
    Linknode* h;
    int a[6] = { 1,2,5,6,8,4 };
    Creatlist(h, a, 6);
    displist(h);
    inserts(h, 3);
    displist(h);
}

指针初始化的时候没有把next设置为null
导致野指针

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/231435
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:为什么会有链表?链表解决了什么问题?[C语言]
  • 除此之外, 这篇博客: 纯C语言打造身份证检验系统,让你一波秀翻你身边的朋友!中的 主函数段 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    如果大家读懂了主函数,或者说是知道要检验一个身份证所需要检验那些东西,那么编写一个身份证检验系统绝对是分分钟就可以完成的了。

    //**核心主函数** 
    int main()
    {
    	char id[20] = { 0 };//定义所需要输入身份证的长度
    	char choose;//为之后查询结束一个之后是否结束程序做准备
    	int year, month, day;
    	printf("※Luckily原创小程序※\n身份证号校验or查询系统\n");
    start:
    	printf("————————————\n");
    	printf("请输入需要查询的身份证号:\n");
    	scanf("%18s", id);
    	if (CheckFormat(id) == 0) goto start;//基础格式的检查,是用来检查身份证是否为18位
    	year = Trans(id[6]) * 1000 + Trans(id[7]) * 100 + Trans(id[8]) * 10 + Trans(id[9]);
    	month = Trans(id[10]) * 10 + Trans(id[11]);//进行年月日的转换,从身份证之中转换出来我们所需要计算的年月日
    	day = Trans(id[12]) * 10 + Trans(id[13]);
    	if (CheckData(year, month, day) == 0)goto start;//检查年月日是否符合正规的日期
    	if (CheckCode(id) == 0) goto start;//身份证最后一位ISO的校验
    	printf("该身份证号是合法的身份证号!\n");
    	printf("————————————\n");
    	printf("信息如下:\n");
    	FindAddress(id);//输出身份证前六位所对应的地理位置
    	FindSex(id);//输出性别
    	FindBirthday(year, month, day);//出生日期
    	FindCode(id);//所在当地是同年同月里第多少个孩子
    	printf("————————————\n");
    	printf("是否要再次查询?按Y继续,按其他键退出。\n");
    	choose = _getch();
    	if (choose == 'Y' || choose == 'y')goto start;
    	system("pause");
    	return 0;
    }
    
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^