我的代码编译没有问题,但是运行有问题
#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
导致野指针
如果大家读懂了主函数,或者说是知道要检验一个身份证所需要检验那些东西,那么编写一个身份证检验系统绝对是分分钟就可以完成的了。
//**核心主函数**
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;
}