#include <stdlib.h>
typedef int Statu;
typedef struct
{
int data;
}elementdata;
typedef struct
{
elementdata element;
LNode* next;
}LNode;
//头指针定义时用 LNode* head;
void initial_L(LNode** head)
{
*head = (LNode*)malloc(sizeof(LNode));
(*head)->next = NULL;
}
void destroy_L(LNode** head)
{
LNode* p;
p = *head;
LNode* s;
while (p)
{
s = p;
p = p->next;
free(s);
}
*head = 0;
}
int ListLength_L(LNode L)
{
LNode* p = L.next;
int j = 0;
while (p)//此处我们用p但是呢和下面不同我们是从0开始,因为我们要保证可能第一个结点就没有的情况
//下面的从一开始是因为他有i和j两个变量可以包括了是否为0的情况,但是我们算起长度的时候先前是没有长度的我们
//必须考虑为0的情况
//如果我们此处用的就是p.next判断的话就是从1开始,要单独考虑0的时候,而且那个最终结点其实就是
//要循环n次多了一次访问最后空的那一次
//而我们从0开始刚好就是n-1次他已经包括了最后为空的那一次而且因为不是p.next不用对0进行讨论
{
p = p->next;
j++;
}
return j;
}
Statu Location_L(LNode L, elementdata e, int* i)
{
LNode* p = L.next;
int j = 1;//具体问题可以具体分析取1还是取0,因为我们这边用的是p.element.data所以是1因为他的意思是该结点的数据域所以
//下标就是该结点位置
while (p && p->element.data != e.data)
{
p = p->next;
j++;
}
if (!p)
return 0;
return j;
}
Statu GetElem_L(LNode L, int i, elementdata* e)//若此处**指的是head的地址,*指的是L的地址,L直接是让函数复制L中的元素
{
//L为带头结点的单链表的头指针
//当第i个元素存在时,将其值赋给e并返回OK,否则ERROR
LNode* p = L.next;//初始化一个结点类型指针,此处和上次的动态数组不一样,动态数组因为是随机存取所以我们只需要利用索引
//所以其定义的指针是elementdata指针,而在这里定义节点指针,是用来指向节点的,而不单纯是数据元素因为还有指针域
//初始化指针使指针指向首元节点
int j = 1;//计数器为1
while (p && j < i)
{
p = p->next;
j++;
}
//顺指针后查找知道第i个元素或者p为NULL即到了最后一个元素
if (!p || j > i)
return 0;//第i个元素不存在 ,此处为什么还要j>i 若链表中没有元素的时候返回节点插入失败。
*e = p->element;
return 1;
}
Statu ListInsert_L(LNode* L, int i, elementdata e)//为什么传递指针因为要改值
{
//在带头结点的单链线性表第i个位置之前插入元素e
LNode* p = L;//指向头结点
int j = 0;//头结点时计数器为0
while (p && j < i - 1)
{
p = p->next;
j++;
}//使p指向第i-1个节点
if (!p || j > i - 1)//j>i-1主要是为了判断当i小于1的时候,因为是前插所以要保证在最后一个元素之前
return 0;
LNode* s = (LNode*)malloc(sizeof(LNode));//生成新结点
s->element = e;
s->next = p->next;
p->next = s;//插入e
return 1;
}
Statu ListDelete_L(LNode* L, int i, elementdata e)
{
//在带头结点的单链线性表中,删除第i个元素,并由e返回其值
LNode* p;
int j = 0;//头结点时计数器为0
p = L;//p先指向头结点,因为若没有头结点删除不方便
while (p->next && j < i - 1) //使p可以指向第i-1个元素
{
p = p->next;
j++;
}
if (!p || j > i - 1)//位置不合适,!p是保证没有超出链表长度,j>i-1 是为了保证当i为负数时不能运行
return 0;
LNode* s = p->next;
p->next = p->next->next;
e = s->element;
free(s);
return 1;
}
void MergeList_L(LNode* La, LNode* Lb, LNode* Lc)
{
//已知单链线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链表Lc,Lc的元素也按值非递减排列
LNode* pa = La->next;
LNode* pb = Lb->next;
LNode* pc = Lc = La;//用La的头结点作为Lc的头结点
while (pa && pb)
{
if (pa->element.data >= pb->element.data)//结构体是不能用于比较的
{
pc->next = pa;
pc = pa;//或者pc.next
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
while (pa || pb)
pc->next = pa ? pa : pb;
free(Lb);//释放Lb的头结点,如果有头指针就要传递二级指针并把,**head = null;
}
编译前未找到相关问题
表以后出现了如下的错误求解决方法