单链表相关操作

来源:互联网 发布:夜鹰大神是谁淘宝 编辑:程序博客网 时间:2024/05/20 13:20
  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的首结点删除了,还是需要改进,还有就是单链表排序问题,第一个排序没有起到作用;
阅读(384) | 评论(0) | 转发(0) |
0

上一篇:Windows信使服务Messenger的安装

下一篇:双链表有关操作的实现

相关热门文章
  • (三)区分的意义 明确不同财...
  • Oracle 聚簇因子
  • 小甲鱼PE详解之基址重定位详解...
  • 小甲鱼PE详解之输入表(导入表...
  • 小甲鱼PE详解之区块描述、对齐...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • 我的博客被删了,请问怎么联系...
  • 一个访问量较大网站的服务器。...
  • 收音机驱动与v4l2架构的关系,...
  • 如何将linux驱动改为裸机驱动(...
  • Fedora 20开机卡在LOGO界面,...
给主人留下些什么吧!~~
原创粉丝点击