c 链表

本文详细介绍了一种使用头结点的链表实现方式,包括链表的创建、节点的增删、链表的逆序和排序等核心操作。通过具体代码示例展示了每一步操作的实现细节,有助于读者深入理解链表的工作原理。

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();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值