在Linux下用c写了个双向链表

  1. /*
  2. sgx 2008-10-30 c语言 双向链表
  3. */
  4. #include <stdio.h>
  5. #include <assert.h>
  6. #include <malloc.h>
  7. #define TRUE 1;
  8. #define FALSE 0;
  9. typedef int ELEMTYPE;
  10. typedef struct DoubleLinkNode
  11. {
  12.     ELEMTYPE data;
  13.     struct DoubleLinkNode *last;
  14.     struct DoubleLinkNode *next;    
  15. }dLinkNode,*dLinkList;
  16. dLinkList CreateDLlist(void);/*创建空链*/
  17. int InitDLlist(dLinkList * dl);/*初始化链*/
  18. int InsertLNode(dLinkNode *pNode,ELEMTYPE e);/*节点前插入节点,返回TRUE,FALSE*/
  19. int InsertNNode(dLinkNode *pNode,ELEMTYPE e);/*在某节点后面插入节点,*/
  20. int DeleteNode(dLinkNode *pNode);/*删除节点,返回TRUE换或FALSE*/
  21. void DestroyDLlist(dLinkList dl);/*销毁链*/ 
  22. void LNTravel(dLinkList dl);/*从前向后遍历*/
  23. void NLTravel(dLinkList dl);/*从后向前遍历*/
  24. int main()
  25. {
  26.     dLinkList dl=CreateDLlist();
  27.     if(InitDLlist(&dl))printf("Initial sucess!/n");
  28.     LNTravel(dl);
  29.     NLTravel(dl);
  30.     DestroyDLlist(dl);
  31.     return 0;
  32. }
  33. dLinkList CreateDLlist(void)/*创建空链*/
  34. {
  35.     dLinkList dl=NULL;
  36.     return dl;
  37. }
  38. int InitDLlist(dLinkList *dl)/*初始化链*/
  39. {
  40.     ELEMTYPE e;
  41.     char symbol;
  42.     dLinkNode *pNode;
  43.     if(*dl!=NULL)
  44.     {printf("this LinkList has been Initialed./n");return FALSE;}
  45.     printf("input data:");
  46.     scanf("%d",&e);
  47.     getchar();/*获取空格*/
  48.      *dl=(dLinkNode*)malloc(sizeof(dLinkNode));
  49.     if(dl==NULL){printf("assigned memory failed,end Initailization!/n");
  50.                 return FALSE;}
  51.     (*dl)->data=e;
  52.     (*dl)->next=NULL;
  53.     (*dl)->last=NULL;
  54.     pNode=*dl;
  55.     printf("continue?y/n ");
  56.     scanf("%c",&symbol);
  57.     getchar();
  58.     while(symbol=='y' || symbol=='Y')
  59.     {
  60.         printf("input data:");
  61.         scanf("%d",&e);
  62.         getchar();
  63.         InsertNNode(pNode,e);
  64.         pNode=pNode->next;
  65.         printf("continue?y/n ");
  66.         scanf("%c",&symbol);
  67.         getchar();
  68.     }
  69.     return TRUE;
  70.     
  71. }
  72. int InsertLNode(dLinkNode *pNode,ELEMTYPE e)/*节点前面插入节点,返回TRUE,FALSE*/
  73. {
  74.     dLinkNode *newNode,*lastNode;
  75.     if(pNode==NULL)
  76.     {
  77.         printf("Node is NULL,canot operate!/n");
  78.         return FALSE;
  79.     }
  80.     newNode = (dLinkNode*)malloc(sizeof(dLinkNode));
  81.     if(!newNode){printf("assigned memory failed!/n");return FALSE;}/*分配失败*/
  82.     newNode->data=e;/*插入数据*/
  83.     if(pNode->last==NULL)
  84.     {
  85.         newNode->last=NULL;
  86.     }
  87.     else
  88.     {
  89.         lastNode = pNode->last;
  90.         lastNode->next = newNode;
  91.         newNode->last = lastNode;
  92.         
  93.     }
  94.     newNode->next=pNode;
  95.     pNode->last=newNode;
  96.     return TRUE;    
  97. }
  98. int InsertNNode(dLinkNode *pNode,ELEMTYPE e)/*在某节点后面插入节点,*/
  99. {
  100.     dLinkNode *newNode,*nextNode;
  101.     if(pNode==NULL)
  102.     {
  103.         printf("Node is NULL,canot operate!/n");
  104.         return FALSE;
  105.     }
  106.     newNode = (dLinkNode*)malloc(sizeof(dLinkNode));
  107.     if(!newNode){printf("assigned memory failed!/n");return FALSE;}/*分配失败*/
  108.     newNode->data = e;/*插入数据*/  
  109.     if(pNode->next==NULL)
  110.     {
  111.         newNode->next=NULL;
  112.     }
  113.     else
  114.     {
  115.         nextNode=pNode->next;
  116.         newNode->next = nextNode;
  117.         nextNode->last=newNode;
  118.     }
  119.     pNode->next=newNode;
  120.     newNode->last=pNode;
  121.     return TRUE;
  122. }
  123. int DeleteNode(dLinkNode *pNode)/*删除节点,返回FALSE或TRUE*/
  124. {
  125.     ELEMTYPE e;
  126.     dLinkNode *LastNode,*NextNode;
  127.     if(pNode==NULL){printf("Node is NULL,cannot operate it!/n");return FALSE;}
  128.     LastNode=pNode->last;
  129.     NextNode = pNode->next;
  130.     e=pNode->data;
  131.     if(pNode->next ==NULL && NULL == pNode->last)
  132.     {
  133.         free(pNode);
  134.         printf("%d is deleted,this LinkList now is NULL!/n",e);
  135.         return TRUE;
  136.     }
  137.     else if(pNode->next == NULL)
  138.     {
  139.         LastNode->next = NULL;  
  140.     }
  141.     else if(pNode->last == NULL)
  142.     {
  143.         NextNode->last=NULL;
  144.     }
  145.     else
  146.     {
  147.         LastNode->next=NextNode;
  148.         NextNode->last=LastNode;
  149.     }
  150.     free(pNode);
  151.     printf("%d is deleted./n",e);
  152.     return TRUE;
  153. }
  154. void DestroyDLlist(dLinkList dl)/*销毁链*/
  155. {
  156.     dLinkNode *pNode=dl;
  157.     dLinkNode *temp;
  158.     if(pNode==NULL)
  159.     {printf("the LinkList has been already destroyed!/n");return;}
  160.     while(pNode->next != NULL)
  161.     {
  162.         temp=pNode;
  163.         pNode=temp->next;
  164.         DeleteNode(temp);
  165.     }
  166.     DeleteNode(pNode);
  167. }
  168. void LNTravel(dLinkList dl)/*从前向后遍历*/
  169. {
  170.     dLinkList pNode;
  171.     if(dl==NULL){printf("LinkList is NULL!/n");return;}
  172.     pNode=dl;
  173.     printf("Travel this LinkList InOrder: ");
  174.     do
  175.     {
  176.         printf("%d/t",pNode->data);
  177.         pNode=pNode->next;
  178.     }while(pNode!=NULL);
  179.     printf("/n");
  180. }
  181. void NLTravel(dLinkList dl)/*从后向前遍历*/
  182. {   dLinkList pNode;
  183.     if(dl==NULL){printf("LinkList is NULL!/n");return;}
  184.     pNode=dl;
  185.     printf("Travel this LinkList PostOrder: ");
  186.     while(pNode->next!=NULL)pNode=pNode->next;
  187.     do
  188.     {
  189.         printf("%d/t",pNode->data);
  190.         pNode=pNode->last;
  191.     }while(pNode!=NULL);
  192.     printf("/n");
  193. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值