我心飞翔

有事不慌,无事不荒,有容乃大,无欲则刚,以德立纲,外圆内方。

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  1 随笔 :: 9 文章 :: 13 评论 :: 0 Trackbacks

struct Lnode  // 定义链表类型
{
  ElemType data;
  struct Lnode *next;
 };
  typedef struct Lnode *LinkList;

  int InitList(LinkList &L)  //初始化一个链表
  {
    L=(LinkList)malloc(sizeof(Lnode));
    if(!L)
     exit(OVERFLOW);
     L->next=NULL;
     return OK;
  }

  int DestroyList(LinkList &L)  //销毁链表
  {
    LinkList q;
    while(L)
    {
      q=L->next;
      free(L);
      L=q;
    }
    return OK;
  }

  int ClearList(LinkList L)  //清零操作
  {
    LinkList p,q;
    q=L->next;
    while(q)
    {
      p=q->next;
      free(q);
      q=p;
    }
    L->next=NULL;
    return OK;
  }

  int ListEmpty(LinkList L)  //判空操作
  {
    if(L->next==NULL)
    return TRUE;
    else
    return FALSE;
  }

  int ListLength(LinkList L)  //计算链表的长度
  {
    LinkList p;
    int i=0;
    p=L->next;
    while(p)
    {
      ++i;
      p=p->next;
    }
    return i;
  }

  int GetElem(LinkList L,int i,ElemType e)  //得到第i个元素的数据域
  {
    LinkList p;
    int j=0;
    p=L->next;
    while(p && j<i-1)
    {
      p=p->next;
      ++j;
    }
    if(j>i || !p)
    return ERROR;
    else
    e=p->data;
    return OK;
  }

  int LocateElem(LinkList L,ElemType e,int (*compare)(ElemType,ElemType))
  {                       //找到第一个对于E满足函数的数据元素的位置
    LinkList p;
    int i=0;
    p=L->next;
    while(p)
    {
      ++i;
      if(compare(p->data,e))
      return i;
      p=p->next;
    }
    return 0;
  }

  int InsertList(LinkList L,int i,ElemType e)  //在第i个数据元素上插入一个元素
  {
    LinkList p,s;
    int j=0;
    p=L;
    while(p && j<i-1)
    {
      p=p->next;
      ++j;
    }
    if(!p || j>i)
    return ERROR;
    s=(LinkList)malloc(sizeof(Lnode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
  }

  int DeleteList(LinkList &L,int i,ElemType e) //删除第i个元素
  {
    LinkList p,q;
    int j;
    j=0;
    p=L;
    while(p->next && j<i-1)
    {
     p=p->next;
     ++j;
    }
    if(!p->next || j>i)
    return ERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    return OK;
  }

  int ListTraverse(LinkList L,int (*vi)(ElemType))
  //对所有链表中的元素进行函数vi操作
  {
    LinkList p;
    p=L->next;
    while(p)
    {
      vi(p->data);
      p=p->next;
    }
    return OK;
  }

  void MergeList(LinkList La,LinkList Lb,LinkList &Lc)
  {                              //合并二个非递减的La和Lb得到一个非递减的Lc
    LinkList pa,pb,pc;
    pa=La->next;
    pb=Lb->next;
    Lc=pc=La;
    while(pa && pb)
    {
      if(pa->data <= pb->data)
      {
        pc->next=pa;
 pc=pa;
 pa=pa->next;
      }
      else{
        pc->next=pb;
 pc=pb;
 pb=pb->next;
      }
    }
    pc->next=pa?pa:pb;
    free(Lb);
 Lb=NULL;
  }

posted on 2005-10-11 22:48 无情雨 阅读(1431) 评论(2)  编辑 收藏 引用 所属分类: 数据结构

评论

# re: 线性链表的操作(C语言) 2007-04-20 13:54 123456
请问一下,这个 int ListTraverse(LinkList L,int (*vi)(ElemType))
在主函数如何应用,就是具体应该怎样实现??
谢谢
  回复  更多评论
  

# re: 线性链表的操作(C语言) 2007-04-20 16:12 wzqxp2002
最好进一步用模版实现  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理