【学习点滴-数据结构-单链表】 求单链表的中间元素和倒数第k个元素

来源:互联网 发布:php微信自定义菜单 编辑:程序博客网 时间:2024/05/22 01:30
/* * 算法功能:建立单链表,输出单链表倒数第k个元素(注意链表的倒数第0个是单链表的最后一个元素),输出单链表的中间元素。 * 函数说明: * 1.getKthElem():求出给定单链表的倒数第k个元素。 * 2.getMidElem():求出单链表的中间元素。    * 算法中的单链表是不带头结点的。  * @author:xiaoq-ohmygirl * @time :2012-06-20 **/#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define MAXNODE 5typedef struct linkNode{    int data;    linkNode * next;}linkNode,*linkList;int initLinkList(linkList & L,int n){    L = (linkList)malloc(sizeof(linkNode));    if(!L){        return 0;    }    scanf("%d",&L->data);    L->next = NULL;    linkList p;    for(int i = n-1;i > 0;i--){         p = (linkList)malloc(sizeof(linkNode));         scanf("%d",&p->data);         p->next = L->next;         L->next = p;    }    return 1;}linkList reverseLinklist(linkList &L){   if( L == NULL || L->next == NULL){       return  L;   }   linkList node = reverseLinklist(L->next);   L->next->next = L;   L->next = NULL;   return node;}void visit(linkNode * node){    if(node != NULL){        printf("%d->",node->data);        }else{        printf("NULL");     }     }void getNewLine(){    printf("\n");}//不带头结点的单链表 void traverseLink(linkList L){    linkNode* cur = L;    getNewLine();    while(cur != NULL){        visit(cur);        cur = cur->next;    }    getNewLine();}/* * 找出单链表的倒数第k个节点 ,注意倒数第0个元素是单链表的尾指针。  **/ linkList getKthElem(int k,const linkList L){     if(k < 0){         return NULL;             }      linkList first = L,second = L;     while(k--){          if(first->next != NULL){              first = first->next;              }else{              return NULL;                      }                            }      while(first->next != NULL){          first = first->next;          second = second->next;        }      return second;                        } /* * 取单链表的中间元素,如果单链表元素为奇数个,那么去中间的元素,如果是偶数个,取前面的一个元素。 */ linkList getMidElem(const linkList L){    if(L == NULL){         return NULL;         }     linkList first = L;    linkList second = L;    while(first != NULL && first->next != NULL){         first = first->next->next;         second = second->next;       }    return second;      } main(){    linkList La = NULL;    initLinkList(La,MAXNODE);     traverseLink(La);    linkList kth;     for(int i = 0;i<MAXNODE;i++){       kth =  getKthElem(i,La);        visit(kth);       printf("\n");         }     printf("mid: ");       linkList mid =  getMidElem(La);    visit(mid);     system("pause");    return 0;}