最近觉得很有必要练习一下基本的数据结构题目。单向链表的反转如果只是描述思路的话,其实很好说明白。但是一旦开始实际的操作,发现会有一些小问题。所以,笔者实打实的写了一下代码,这里只展示一下几个基本函数。
链表的构建 --
typedef struct LinkNode {
unsigned int value;
struct LinkNode *pNext;
}LinkNode, *pLinkNode;
pLinkNode CreateLinkNode(unsigned int val) {
pLinkNode pHead = (pLinkNode)malloc(sizeof(pLinkNode));
printf("\n\n~~~~~~~~~~~~ CreateLinkNode ~~~~~~~~~~~~ val = %u\n",val);
pHead->value = val;
pHead->pNext = NULL;
return pHead;
}
遍历以及计数 --
// calculate the number of elements
int TraverseLink(pLinkNode pNode) {
printf("\n\n~~~~~~~~~~~ TraverseLink ~~~~~~~~~~\n");
if(pNode==NULL) {
printf("pNode == NULL so print NOTHING\n");
return 0;
}
int count = 0;
while(pNode!=NULL) {
printf("@@@@@ %u @@@@@\n",pNode->value);
pNode = pNode->pNext;
count++;
}
return count;
}
最关键的函数,元素逆转 --
pLinkNode ReverseLink(pLinkNode pHead) {
printf("\n\n~~~~~~~~~~~ ReverseLink ~~~~~~~~~~\n");
if(pHead==NULL)
return NULL;
pLinkNode p_cur = pHead;
pLinkNode p_previous = NULL;
pLinkNode p_next = NULL;
while(p_cur!=NULL) {
p_next = p_cur->pNext;
p_cur->pNext = p_previous;
p_previous = p_cur;
p_cur = p_next;
}
return p_previous;
}
这里,有必要提及一下销毁链表的函数 --
void DestroyLink(LinkNode **pNode) {
printf("\n\n~~~~~~~~~~~ DestroyLink ~~~~~~~~~~\n");
if((*pNode)==NULL)
return;
int count = 0;
LinkNode *p_cur = *pNode;
LinkNode **p_previous = pNode;
while(p_cur!=NULL) {
printf("\n@@@@@@@@@@@@@@@@ %d checking %u !!! @@@@@@@@@@@@\n",count,p_cur->value);
// set up the previous pointer
*p_previous = p_cur;
// let the current pointer moves to the next element
p_cur = p_cur->pNext;
// clear up the previous pointer
free(*p_previous);
*p_previous = NULL;
count++;
}
*p_previous = NULL;
*pNode = NULL;
return;
}
因为本人有点儿强迫症,喜欢free某个空间后,把指针置为NULL,因此这里传递的参数需要是**标记的指向指针的指针。
刚开始写的时候没有注意,只是用了指针,结果根本无法把链表的每个元素指针置为空值,后来意识到了错误在哪里,具体可以看笔者的另一篇博文《c语言函数free某个空间》。
(码字不易,转载请注明出处)