typedef struct node
{
int data;
struct node* pNext;
}Node;
//链表的操作,以有头节点为例,无头节点类似
Node* head = NULL;
//创建链表,头结点data=0,pNext=NULL;
MMI_BOOL createNodeList()
{
//int *p=NULL;
//p=OslMalloc(sizeof(int));
// dbg_print("createNodeList 11 p=%x\r\n",p);
//if(p==NULL)
// return MMI_FALSE;
head = (Node*)OslMalloc(sizeof(Node));
// dbg_print("createNodeList 11 head->pNext=%x,head=%x\r\n",head->pNext,head);
if(NULL == head)
{
dbg_print("createNodeList 22222\r\n");
return MMI_FALSE;
}
else
{
dbg_print("createNodeList 3333\r\n");
head->data = 0;
head->pNext = NULL;
dbg_print("createNodeList head->pNext=%x,head=%x\r\n",head->pNext,head);
dbg_print("createNodeList *(head->pNext)=%x,*head=%x\r\n",*(head->pNext),*head);
return MMI_TRUE;
}
}
//增加节点
/*
main2 node1=-0xffa0b14
main2 node2=-0xffa0a9c
main2 node3=-0xffa0aec
createNodeList 3333
createNodeList head->pNext=0x0,head=-0xffa0844
createNodeList *(head->pNext)=-0x1a600fe8,*head=-0x1a600fe8
addNode11 qh->pNext=0x0,qh=-0xffa0844
addNode11 pn->pNext=-0x1a600fe8,pn=0x0
addNode33 qh->pNext=-0xffa0b14,head->pNext=-0xffa0b14,*(qh->pNext)=0x1,pn=0x0,*pn=0x0
addNode22 qh->pNext=-0xffa0b14,qh=-0xffa0844
addNode22 pn->pNext=-0x1a600fe8,pn=0x0
addNode11 qh->pNext=-0xffa0b14,qh=-0xffa0844
addNode11 pn->pNext=0x0,pn=-0xffa0b14
addNode pn->pNext=-0x1a600fe8,pn->data=-442503144
addNode33 qh->pNext=-0xffa0a9c,head->pNext=-0xffa0b14,*(qh->pNext)=0x2,pn=0x0,*pn=0x0
addNode22 qh->pNext=-0xffa0a9c,qh=-0xffa0b14
addNode22 pn->pNext=-0x1a600fe8,pn=0x0
addNode44 pn->data=0x1
reverseNodeList q->data=-0x1a600fe8
reverseNodeList head=-0xffa0844
addNode11 qh->pNext=-0xffa0a9c,qh=-0xffa0844
addNode11 pn->pNext=-0xffa0b14,pn=-0xffa0a9c
addNode pn->pNext=0x0,pn->data=1
addNode pn->pNext=-0x1a600fe8,pn->data=-442503144
addNode33 qh->pNext=-0xffa0aec,head->pNext=-0xffa0a9c,*(qh->pNext)=0x3,pn=0x0,*pn=0x0
addNode22 qh->pNext=-0xffa0aec,qh=-0xffa0b14
addNode22 pn->pNext=-0x1a600fe8,pn=0x0
addNode44 pn->data=0x2
sort tmp=0x3
sort pj.data=0x2,pj.pNext=0x0
sort tmp=0x2
sort pj.data=0x1,pj.pNext=0x0
deleteNode111 length=0x1
deleteNode111 p=-0xffa0b14
deleteNode111 length=0x2
deleteNode111 p=-0xffa0aec
deleteNode111 length=0x3
deleteNode111 p=0x0
destroyNodeList tmp->data=0x3,tmp->pNext=-0xffa0aec
destroyNodeList tmp->data=0x1,tmp->pNext=0x0
*/
#if 0
/*
*1node,pnext=node;
*2node,pnext
*/
MMI_BOOL addNode(Node* node)
{
Node* pn = head->pNext;
Node* qh = head;
Node* dn=head->pNext;
Node* dh=head;
if(NULL == head)
{
return MMI_FALSE;
}
dbg_print("addNode11 qh->pNext=%x,qh=%x\r\n",qh->pNext,qh);/*q指向 head,那跟head->pnext 是一样*/
dbg_print("addNode11 pn->pNext=%x,pn=%x\r\n",pn->pNext,pn);/*q指向 head,那跟head->pnext 是一样*/
while(NULL != pn)
{
qh = pn;
pn = pn->pNext;
dbg_print("addNode pn->pNext=%x,pn->data=%d\r\n",pn->pNext,pn->data);
}
qh->pNext = node;/*qh是指向上一个节点的next,*/
dbg_print("addNode33 qh->pNext=%x,head->pNext=%x,*(qh->pNext)=%x,pn=%x,*pn=%x\r\n",qh->pNext,head->pNext,*(qh->pNext),pn,*pn);/*q指向 head,那跟head->pnext 是一样*/
node->pNext = NULL;
dbg_print("addNode22 qh->pNext=%x,qh=%x,,qh->data=%x\r\n",qh->pNext,qh,pn->data);/*q指向 head,那跟head->pnext 是一样*/
dbg_print("addNode22 pn->pNext=%x,pn=%x\r\n",pn->pNext,pn);/*q指向 head,那跟head->pnext 是一样*/
while(dh!=NULL)
{
dbg_print("addNode44 pn->data=%x,dh=%x\r\n",dh->data,dh);/*q指向 head,那跟head->pnext 是一样*/
dh=dh->pNext;
}
return MMI_TRUE;
}
#else
/*
*1node,pnext=node;
*2node,pnext
*3node,pnext
addNode44 pn->data=0x0,dh=-0xffa086c
addNode44 pn->data=0x0,dh=-0xffa086c
addNode44 pn->data=0x1,dh=-0xffa0b14
addNode44 pn->data=0x0,dh=-0xffa086c
addNode44 pn->data=0x1,dh=-0xffa0b14
addNode44 pn->data=0x2,dh=-0xffa0a9c
sort tmp=0x2
sort pj.data=0x1,pj.pNext=-0xffa0aec
sort tmp=0x3
sort pj.data=0x2,pj.pNext=0x0
sort tmp=0x2
sort pj.data=0x1,pj.pNext=0x0
sort pHead->data=0x0
sort pHead->data=0x3
sort pHead->data=0x2
*/
MMI_BOOL addNode(Node *node)
{
// Node *pn=head->pNext;
Node *pn=head;
Node *pa=head->pNext;
Node *pa_n=head->pNext;
/*
*1.遍历已经存在的链表,找到链表的末尾
*/
while(pn->pNext!=NULL)
{
pn=pn->pNext;
}
/*
*2.把新的节点加到已经有的链表里面
*/
pn->pNext=node;
dbg_print("addNode node->data=%x\r\n",node->data);
node->pNext=NULL;
while(pa!=NULL)
{
dbg_print("addNode44 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
}
}
#endif
/*
main2 node1=-0xffa07cc
main2 node2=-0xffa0ac4
main2 node3=-0xffa0a9c
createNodeList 3333
createNodeList head->pNext=0x0,head=-0xffa081c
createNodeList *(head->pNext)=-0x1a600fe8,*head=-0x1a600fe8
addNode node->data=0x1
addNode node->data=0x2
addNode44 pa->data=0x1,pa=-0xffa07cc
addNode44 pa->data=0x2,pa=-0xffa0ac4
addNode node->data=0x3
addNode44 pa->data=0x1,pa=-0xffa07cc
addNode44 pa->data=0x2,pa=-0xffa0ac4
addNode44 pa->data=0x3,pa=-0xffa0a9c
sort pHead->data=0x3
sort pHead->data=0x2
sort pHead->data=0x1
deleteNode111 length=0x1
deleteNode111 p=-0xffa0ac4
deleteNode111 length=0x2
deleteNode111 p=-0xffa0a9c
deleteNode111 length=0x3
deleteNode111 p=0x0
deleteNode22 pa->data=0x3,pa=-0xffa07cc
deleteNode22 pa->data=0x2,pa=-0xffa0ac4
deleteNode22 pa->data=0x1,pa=-0xffa0a9c
deleteNode44 length=0x3,index=0x2
deleteNode55 q->data=0x0,q=-0xffa081c,q->pNext=-0xffa07cc
deleteNode55 p->data=0x0,p=-0xffa081c,p->pNext=-0xffa07cc
deleteNode66 q->data=0x0,q=-0xffa081c,q->pNext=-0xffa07cc
deleteNode66 p->data=0x3,p=-0xffa07cc,p->pNext=-0xffa0ac4
deleteNode55 q->data=0x3,q=-0xffa07cc,q->pNext=-0xffa0ac4
deleteNode55 p->data=0x3,p=-0xffa07cc,p->pNext=-0xffa0ac4
deleteNode66 q->data=0x3,q=-0xffa07cc,q->pNext=-0xffa0ac4
deleteNode66 p->data=0x2,p=-0xffa0ac4,p->pNext=-0xffa0a9c
deleteNode77 p->data=0x2,p=-0xffa0ac4,p->pNext=-0xffa0a9c
deleteNode77 q->data=0x3,q=-0xffa07cc,q->pNext=-0xffa0a9c
deleteNode33 pa->data=0x3,pa=-0xffa07cc
deleteNode33 pa->data=0x1,pa=-0xffa0a9c
*/
//删除节点
MMI_BOOL deleteNode(int index)
{
Node* p = head->pNext;
Node *pa=head->pNext;
Node* q = head;
int length = 0;
int i=0;
if(NULL == head)
{
return MMI_FALSE;
}
while(NULL != p)
{
length ++;
dbg_print("deleteNode111 length=%x\r\n",length);
p = p->pNext;
dbg_print("deleteNode111 p=%x\r\n",p);
}
while(pa!=NULL)
{
dbg_print("deleteNode22 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
}
dbg_print("deleteNode44 length=%x,index=%x\r\n",length,index);
if(length < index) /*链表总长度小于要删除节点的长度*/
{
return MMI_FALSE;
}
else
{
p = head; /* head 3,2,1 */
for(i=0;i<index;i++) /* 找到要删除节点的上一个节点 从head开始 */
{
q = p;
dbg_print("deleteNode55 q->data=%x,q=%x,q->pNext=%x\r\n",q->data,q,q->pNext);/* 0 */
dbg_print("deleteNode55 p->data=%x,p=%x,p->pNext=%x\r\n",p->data,p,p->pNext);/* 0 */
p = p->pNext;
dbg_print("deleteNode66 q->data=%x,q=%x,q->pNext=%x\r\n",q->data,q,q->pNext);/*0*/
dbg_print("deleteNode66 p->data=%x,p=%x,p->pNext=%x\r\n",p->data,p,p->pNext);/*3*/
}
{
Node* t = p->pNext; /* 保存要删除节点的下一个节点,不然链表会掉链子 */
q->pNext = t; /* 要删除节点的下一个节点,放到要删除节点的上一个节点 */
dbg_print("deleteNode77 p->data=%x,p=%x,p->pNext=%x\r\n",p->data,p,p->pNext);/*q指向 head,那跟head->pnext 是一样*/
dbg_print("deleteNode77 q->data=%x,q=%x,q->pNext=%x\r\n",q->data,q,q->pNext);/*q指向 head,那跟head->pnext 是一样*/
}
pa=head->pNext;
while(pa!=NULL)
{
dbg_print("deleteNode33 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
}
OslMfree(p);
return MMI_TRUE;
}
while(pa!=NULL)
{
dbg_print("deleteNode22 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
}
}
//逆序
#if 0
void reverseNodeList()
{
Node* p = head->pNext;
Node* q = p->pNext;
Node* t = NULL;
Node* pa = head->pNext;
if(NULL == head)
{
return;
}
//如果链表长度为1
if(head->pNext == NULL)
{
return;
}
while(pa!=NULL)
{
dbg_print("reverseNodeList22 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
dbg_print("reverseNodeList22 pat=%x,pa->pNext=%x\r\n",pa,pa->pNext);
dbg_print("reverseNodeList55 p->data=%x,p->pNext=%x,p=%x\r\n",p->data,p->pNext,p);
}
while(NULL != q)
{
dbg_print("reverseNodeList11 p->data=%x,p->pNext=%x,p=%x\r\n",p->data,p->pNext,p);
t = q->pNext;
q->pNext = p;
p = q;
q = t;
dbg_print("reverseNodeList12 q->data=%x,q->pNext=%x,q=%x\r\n",q->data,q->pNext,q);
}
while(pa!=NULL)
{
dbg_print("reverseNodeList33 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
dbg_print("reverseNodeList33 pat=%x,pa->pNext=%x\r\n",pa,pa->pNext);
}
head->pNext->pNext = NULL;
head->pNext = p;
pa=head->pNext;
while(pa!=NULL)
{
dbg_print("reverseNodeList44 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
dbg_print("reverseNodeList pat=%x,pa->pNext=%x\r\n",pa,pa->pNext);
}
dbg_print("reverseNodeList head=%x\r\n",head);
}
#else
/*
main2 node1=-0xffa0a9c
main2 node2=-0xffa0b14
main2 node3=-0xffa0aec
createNodeList 3333
createNodeList head->pNext=0x0,head=-0xffa0894
createNodeList *(head->pNext)=-0x1a600fe8,*head=-0x1a600fe8
addNode node->data=0x1
addNode node->data=0x2
addNode44 pa->data=0x1,pa=-0xffa0a9c
addNode44 pa->data=0x2,pa=-0xffa0b14
addNode node->data=0x3
addNode44 pa->data=0x1,pa=-0xffa0a9c
addNode44 pa->data=0x2,pa=-0xffa0b14
addNode44 pa->data=0x3,pa=-0xffa0aec
reverseNodeList p=-0xffa0b14,p->pNext=-0xffa0aec,p->data=0x2
reverseNodeList p=-0xffa0aec,p->pNext=0x0,p->data=0x3
reverseNodeList44 pa->data=0x1,pa=-0xffa0a9c
reverseNodeList pat=0x0,pa->pNext=-0x1a600fe8
sort pHead->data=0x3
sort pHead->data=0x2
sort pHead->data=0x1
*/
void reverseNodeList()
{
Node *p=head->pNext, *p2=NULL,*tmp=NULL;
Node *pa=head->pNext;
#if 0
p =head->pNext;// node1
dbg_print("reverseNodeList11 p=%x,p->pNext=%x\r\n",p,p->pNext);
tmp =p->pNext; // node2
p->pNext = NULL; // node 2
head->pNext = p; // node 1
p = tmp; // node 2
#else
#endif
// p p2
// head ,1 ,2 ,3
while (p) {
dbg_print("reverseNodeList p=%x,p->pNext=%x,p->data=%x\r\n",p,p->pNext,p->data);
p2 = p->pNext;
tmp=p2->pNext;
p->pNext = head->pNext;
head->pNext= p;
p = tmp;
}
while(pa!=NULL)
{
dbg_print("reverseNodeList44 pa->data=%x,pa=%x\r\n",pa->data,pa);/*q指向 head,那跟head->pnext 是一样*/
pa=pa->pNext;
dbg_print("reverseNodeList pat=%x,pa->pNext=%x\r\n",pa,pa->pNext);
}
}
#endif
//排序(降序)
#if 0
void sort()
{
Node* pHead = head;
Node* pi = pHead->pNext;
Node* pj = pi->pNext;
dbg_print("sort22 pj.data=%x,pi.data=%x\r\n",pj->data,pi->data);
if(head == NULL)
{
return;
}
if(pHead->pNext == NULL)
{
return;
}
for(;pi != NULL;pi=pi->pNext)
{
for(pj = pi->pNext;pj != NULL;pj=pj->pNext)
{
dbg_print("sort pj.data=%x,pi.data=%x\r\n",pj->data,pi->data);
if(pj->data>pi->data)
{
int tmp = pj->data;
pj->data = pi->data;
pi->data = tmp;
dbg_print("sort tmp=%x\r\n",tmp);
dbg_print("sort pj.data=%x,pj.pNext=%x\r\n",pj->data,pj->pNext);
}
}
}
pHead=head->pNext;
while(pHead!= NULL)
{
dbg_print("sort pHead->data=%x\r\n",pHead->data);
pHead=pHead->pNext;
}
}
#else
/* 4,5,1,3,2*/
void sort()
{
int tmp=0;
Node* pi=head->pNext;
Node* pj=head;
Node* pHead = head;
for(;pi!=NULL;pi=pi->pNext)
for(pj=pi->pNext;pj!=NULL;pj=pj->pNext)
{
if(pi->data<pj->data)
{
tmp=pi->data;
pi->data=pj->data;
pj->data=tmp;
}
}
pHead=head->pNext;
while(pHead!= NULL)
{
dbg_print("sort pHead->data=%x\r\n",pHead->data);
pHead=pHead->pNext;
}
}
#endif
//销毁
void destroyNodeList()
{
Node* p = head->pNext;
if(NULL == head)
{
return;
}
if(NULL == head->pNext)
{
OslMfree(head);
head = NULL;
return;
}
while(NULL != p)
{
{
Node* tmp = p;
p = p->pNext;
dbg_print("destroyNodeList tmp->data=%x,tmp->pNext=%x\r\n",tmp->data,tmp->pNext);
OslMfree(tmp);
}
}
OslMfree(head);
head = NULL;
}
void main2()
{
Node* node1 = (Node*)OslMalloc(sizeof(Node));
Node* node2 = (Node*)OslMalloc(sizeof(Node));
Node* node3 = (Node*)OslMalloc(sizeof(Node));
node1->data = 1;
node1->pNext = NULL;
dbg_print("main2 node1=%x\r\n",node1);
node2->data = 2;
node2->pNext = NULL;
dbg_print("main2 node2=%x\r\n",node2);
node3->data = 3;
node3->pNext = NULL;
dbg_print("main2 node3=%x\r\n",node3);
createNodeList();
addNode(node1);
addNode(node2);
addNode(node3);
//reverseNodeList();
sort();
deleteNode(2);
//destroyNodeList();
}
本文详细介绍了一种使用头结点的链表实现方式,包括链表的创建、节点的增删、链表的逆序和排序等核心操作。通过具体代码示例展示了每一步操作的实现细节,有助于读者深入理解链表的工作原理。

被折叠的 条评论
为什么被折叠?



