Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417714
  • 博文数量: 73
  • 博客积分: 3326
  • 博客等级: 中校
  • 技术积分: 631
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-05 15:31
文章分类

全部博文(73)

文章存档

2014年(1)

2011年(51)

2010年(21)

分类: C/C++

2010-07-28 11:55:54

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #define OK 1
  4. #define ERROR 0
  5. typedef ElemType int;

  6. typedef struct LNode{
  7.   ElemType data; //数据域

  8.   struct LNode *next; //指针域

  9. }LNode;
  10. typedef LNode *LinkList; //单链表类型名


  11. void WarnMessage(char *s)
  12. {
  13.     printf(s);
  14. }

  15. LNode* CreateNode(ElemType e)//创建结点

  16. {
  17.     LNode *temp = (LNode*)malloc(sizeof(LNode));
  18.     temp->data = e;
  19.     temp->next = NULL;
  20.     return temp;
  21. }

  22. void DestoryList_Link(LinkList *LHead)//销毁单链表;

  23. /*从头结点开始,释放每个结点的空间*/
  24. {
  25.     if(NULL == *LHead)
  26.     {
  27.         WarnMessage("\nThere are no Nodes to be freed!\n");
  28.         return;
  29.     }
  30.     else{
  31.         LinkList p;
  32.         /*从头结点开始,一一释放结点的空间*/
  33.         while(*LHead){
  34.             p = (*LHead)->next;
  35.             free(*LHead);
  36.             *LHead = p;
  37.         }
  38.     }
  39. }

  40. int ListLength_Link(LinkList *LHead)//求链表长度;

  41. /*通过遍历各结点,将长度length加一*/
  42. {
  43.     int length = 0;//定义表长变量length并初始化为0;

  44.     if(NULL == *LHead)
  45.     {
  46.         return 0;
  47.     }
  48.     LNode *p = *LHead;
  49.     while(p){
  50.         length++;
  51.         p=p->next;
  52.     }
  53.     return length;
  54. }

  55. void ListInsert_Link(LinkList *LHead,int i,LNode *node)//在单链表中插入元素;

  56. /*在单链表L中第i个位置之前插入值e的结点,1<=i<=表长+1;*/
  57. {
  58.     if(NULL == *LHead){
  59.         *LHead = node;/*如果头结点指针域为空,则当前结点作为第一个结点*/
  60.         return ;
  61.     }
  62.     /*头结点指针域不为空,指针指向第一个结点
  63.     **移动指针,找到相应的插入位置;
  64.     */
  65.     LNode *p = *LHead;
  66.     int k=0;
  67.     while(p && k<(i-1)){
  68.         k ++;
  69.         p = p->next;
  70.     }
  71.     if(!p ||(k > i-1)){
  72.         WarnMessage("Input Error,Insert Failed!\n");
  73.     }
  74.     else{

  75.         node->next = p->next;
  76.         p->next = node;
  77.     }
  78. }

  79. ElemType GetElem_Link(LinkList *LHead,int i)//某位置i取元素值;

  80. {
  81.     ElemType re_data = 0;
  82.     if(NULL == *LHead){
  83.         return ERROR;
  84.     }
  85.     if(i>ListLength_Link(LHead)){
  86.         printf("input error!\n");
  87.         return ERROR;
  88.     }
  89.     LinkList Temp = *LHead;
  90.     int k = 0;
  91.     while(Temp && k<(i-1)){
  92.         Temp = Temp->next;
  93.         k++;
  94.     }
  95.     re_data = Temp->data;
  96.     return re_data;
  97. }

  98. State ListDelete_Link(LinkList *LHead,int i)//删除特定的元素。

  99. /*在带头结点的单链表中,删除第i个元素*/
  100. {
  101.     LinkList p,temp;
  102.     if(NULL == *LHead){
  103.         WarnMessage("NO Node to be deleted!");
  104.         return ERROR;
  105.     }
  106.     if(i>ListLength_Link(LHead)){
  107.         return ERROR;
  108.     }
  109.     p = *LHead;
  110.     int k = 0;
  111.     while(p->next && (k<i-1)){
  112.         p = p->next;
  113.         ++k;
  114.     }
  115.     temp = p->next;
  116.     p->next = temp->next;
  117.     free(temp);
  118.     return OK;
  119. }

  120. int LocateElem_Link(LinkList *LHead,ElemType e)//定位元素的位置。

  121. /*根据结点数据值,找到到其所在位置*/
  122. {
  123.     LinkList p = *LHead;
  124.     int k=0;
  125.     while(p&&(p->data != e))
  126.     {
  127.         p=p->next;
  128.         ++k;
  129.     }
  130.     return k;
  131. }

  132. void LNode_Traver(LinkList *LHead)
  133. /*从头结点开始遍历整个链表*/
  134. {
  135.     LinkList p = *LHead;
  136.     while(NULL != p)
  137.     {
  138.         printf("%d-->",p->data);
  139.         p = p->next;
  140.     }
  141.     WarnMessage("\n\n");
  142. }

  143. /*
  144. **根据结点数据域的大小进行由大到小的排序
  145. */
  146. /*这个排序方法不怎么实用
  147. void Sort_LinkList(LinkList *LHead){
  148.     LinkList p,q,big;
  149.     Elemtype temp;
  150.     for(p = (*LHead)->next;p->next;p = p->next){
  151.         big = p;
  152.         for(q = p->next;q->next;q = q->next){
  153.             if(q->data > big->data){
  154.                 big = q;
  155.             }
  156.         }
  157.         if(p != big){
  158.             temp = p->data;
  159.             p->data = big->data;
  160.             big->data = temp;
  161.         }
  162.     }
  163. }
  164. */
  165. //另一种单链表排序方法

  166. void selectsort(LinkList *g)
  167. {
  168.     LNode *p,*q,*t,*s,*h;
  169.     h=(LNode *)malloc(sizeof(LNode));
  170.     h->next=*g; /*h-->g的第一个结点*/
  171.     p=h; //p,h->同一地址

  172.     while(p->next->next!=NULL)
  173.     {
  174.           for(s=p,q=p->next;q->next!=NULL;q=q->next)
  175.            if(q->next->data<s->next->data)
  176.            s=q;
  177.           if(s!=q)
  178.           {
  179.               t=s->next;
  180.                s->next=t->next;
  181.               t->next=p->next;
  182.               p->next=t;
  183.           }
  184.      p=p->next;
  185.     }
  186.     *g=h->next;
  187.         free(h);
  188. }

  189. /*将两个单链表A,B归并成新的单链表C
  190. **设置两个指针分别指向A,B的第一个结点,第三个指针指向空表
  191. **当其中一个表为空时,表示其已并完,只需将另一表中元素归并到C中;
  192. */
  193. void MergeList_L(LinkList *HeadA,LinkList *HeadB,LinkList *HeadC){
  194.     LinkList pa,pb,pc;
  195.     /*pa,pb分别指向第一个结点,pc作为新链表的头指针*/
  196.     pa = (*HeadA)->next;
  197.     pb = (*HeadB)->next;
  198.     *HeadC = pc = *HeadA; //将HeadA的头结点作为HeadC头结点

  199.     while(pa && pb){
  200.         if(pa->data <= pb->data){
  201.             pc->next = pa;
  202.             pc = pa;//移动结点指针至新插入的当前结点

  203.             pa = pa->next;
  204.         }
  205.         else{
  206.             pc->next = pb;
  207.             pc = pb;
  208.             pb = pb->next;
  209.         }
  210.     }
  211.         pc->next = pa ? pa : pb;
  212.         free(*HeadB);
  213. }
  214. 以上代码还是有点小问题,比如最后一个归并函数,我运行的时候,居然把链表B的首结点删除了,还是需要改进,还有就是单链表排序问题,第一个排序没有起到作用;
阅读(1842) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~