1 typedef char ListData; 2 //表示以后可以用ListData来代替char类型 3 4 typedef struct node{ //此处node,只在结构体中出现和使用 5 ListData data; 6 struct node *link; 7 }ListNode; //表示将整个结构体命名为ListNode,也就是说现在ListNode就是一种像int、char等的数据类型了,可以用它来定义别的节点 8 9 typedef ListNode *LinkList; //此处,表示以后可以用*LinkList来代替ListNode类型,其中LinkList表示的是指针,*LinkList表示的是指针所指的节点,即ListNode 10 11 LinkList first; //表示定义了一个指针,叫做first,但不能说此时它就是头指针了,首先还要进行空间分配,其次只有在它的基础上继续插入别的指针并且始终保持它在最前面才行 12 13 14 ==================以下要好好理解===================== 15 16 ListNode *p; //定义了一个指针,指向*p节点 17 18 LinkList p; //和上式效果相同,直接定义了一个指针 19 20 所以说, 21 ListNode *p = first; 22 和 23 ListLink first; 24 中的first都是指针,p也是指针 25 26 更好的写法是 27 ListNode* p = first; 28 29 类比: 30 typedef int* intPointer; 31 32 int* p, *q; 33 等价于 34 intPointer p, q; 35 36 注意: int* p 等价于 int *p 37 38 补充: 39 //指针可以理解为一段地址,指向着某个element 40 41 //定义一个指针 42 int* pCount; 43 char* pLetter; 44 45 //&表示取地址符号 46 pCount = &count; 47 48 //由指针得到所指内容,用*符号 49 int a = *pCount;
另外:
1.队列中的头节点是空的,详见下面的删除头节点的函数
1 Status DeQueue_L(LinkQueue &Q, QElemType &e) { //如果想要真正的改变的话,就使用取地址符&,通过地址来对真正的进行操作,而非局部范围内 2 //若队列不空,则删除Q的队头元素结点,用e返回其值,并返回OK;否则返回ERROR 3 if (Q.front = =Q.rear) return ERROR; 4 //若队列空,返回ERROR 5 p=Q.front->next; // p指向队头元素结点 6 e=p->data; 7 Q.front->next=p->next; // 修改链队列头结点指针 8 if(Q.rear= =p) Q.rear=Q.front; 9 // 对于链队列只有一个元素结点的情况,要同时修改队尾指针 10 free(p); 11 return OK; 12 }