1.链式存储的节点代码
//节点
typedef struct Node {
//struct Node为结构标记,由于在结构的成员有指向该结构的指针,所以这里必须使用结构标记
ElemType data;
struct Node* next;
}Node;
typedef struct Node* LinkList;//LinkList类型是指向Node结构变量的指针
2.一级指针、二级指针以及引用变量的区分
数据结构中的二级指针和引用 - 信仰-> - 博客园 (cnblogs.com)
简单总结一下,就是C++中有引用变量(所以在使用引用变量时文件后缀要改为cpp。)。
引用变量相当于被引用变量的别名,二者地址、内容相同。
将引用作为函数参数可以做到在函数中修改引用到的变量,和指针功能类似,相当于加一层指针。(我总结的不太好.....
引用变量和二级指针,在线性表的链式表示中作用一样,都是在函数中修改了头指针的时候必须使用二级指针或引用变量,比如链表的初始化和销毁链表的操作。
Status InitList_0(LinkList* L) {
//链表初始化
//这里L相当于二重指针;
*L = (LinkList)malloc(sizeof(Node));
if (!(*L))//如果内存分配失败
return ERROR;
(*L)->next = NULL;
return OK;
}
Status InitList_1(LinkList& L) {
//链表初始化
//这里L为引用变量;
L = (LinkList)malloc(sizeof(Node));
if (!L)//如果内存分配失败
return ERROR;
L->next = NULL;
return OK;
}
其他类似于插入、删除、清空链表等函数的参数使用LinkList类型、二级指针、引用变量都可以实现。
Status ClearList_0(LinkList &L)
{
//清空链表,使用引用变量
LinkList p,q;
p=L->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
L->next=NULL; /* 头结点指针域为空 */
return OK;
}
Status ClearList_1(LinkList L)
{
//清空链表,使用一级指针
LinkList p,q;
p=L->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
L->next=NULL; /* 头结点指针域为空 */
return OK;
}
Status ClearList_2(LinkList *L)
{
//清空链表,使用二级指针
LinkList p,q;
p=(*L)->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL; /* 头结点指针域为空 */
return OK;
}
3.C6011:取消对NULL指针“_____“的引用解决办法
出现如上错误,大部分原因是动态分配内存后没有检测是否分配成功而导致L的值可能是NULL.
*L = (LinkList)malloc(sizeof(Node));
if (!(*L))//如果内存分配失败
return ERROR;
4.warning C4244: “参数”: 从“time_t”转换到“unsigned int”,可能丢失数据
这是因为在VS中,前者是64位后者是32位。
进行强制类型转换即可消除。
srand((unsigned int)time(0));
5.错题
单链表与链表长度有关的操作是-删除单链表的最后一个元素(没有前驱,只能遍历