| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1049 人关注过本帖
标题:单循环链表的问题
只看楼主 加入收藏
cxlttt
Rank: 1
等 级:新手上路
帖 子:16
专家分:7
注 册:2010-3-28
结帖率:66.67%
收藏
 问题点数:0 回复次数:2 
单循环链表的问题
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<math.h> /* floor(),ceil(),abs() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int ElemType;
struct LNode
{
  ElemType data;
  struct LNode *next;
};
typedef struct LNode *LinkList;
Status InitList_CL(LinkList *L)
{ /* 操作结果:构造一个空的线性表L */
  *L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
  if(!*L) /* 存储分配失败 */
    exit(OVERFLOW);
  (*L)->next=*L; /* 指针域指向头结点 */
  return OK;
}
int ListLength_CL(LinkList L)
  int i=0;
  LinkList p=L->next; /* p指向头结点 */
  while(p!=L) /* 没到表尾 */
  {
    i++;
    p=p->next;
  }
  return i;
}
int LocateElem_CL(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
  int i=0;
  LinkList p=L->next->next; /* p指向第一个结点 */
  while(p!=L->next)
  {
    i++;
    if(compare(p->data,e)) /* 满足关系 */
      return i;
    p=p->next;
  }
  return 0;
}
/* 在L的第i个位置之前插入元素e */
Status ListInsert_CL(LinkList *L,int i,ElemType e) /* 改变L */
{
  LinkList p=(*L)->next,s; /* p指向头结点 */
  int j=0;
  if(i<=0||i>ListLength_CL(*L)+1) /* 无法在第i个元素之前插入 */
    return ERROR;
  while(j<i-1) /* 寻找第i-1个结点 */
  {
    p=p->next;
    j++;
  }
  s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
  s->data=e; /* 插入L中 */
  s->next=p->next;
  p->next=s;
  if(p==*L) /* 改变尾结点 */
    *L=s;
  return OK;
}
/* 删除L的第i个元素,并由e返回其值 */
Status ListDelete_CL(LinkList *L,int i,ElemType *e) /* 改变L */
{
  LinkList p=(*L)->next,q; /* p指向头结点 */
  int j=0;
  if(i<=0||i>ListLength_CL(*L)) /* 第i个元素不存在 */
    return ERROR;
  while(j<i-1) /* 寻找第i-1个结点 */
  {
    p=p->next;
    j++;
  }
  q=p->next; /* q指向待删除结点 */
  p->next=q->next;
  *e=q->data;
  if(*L==q) /* 删除的是表尾元素 */
    *L=p;
  free(q); /* 释放待删除结点 */
  return OK;
}
Status ListTraverse_CL(LinkList L,void(*vi)(ElemType))
{ /* 初始条件:L已存在。操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
  LinkList p=L->next->next;
  while(p!=L->next)
  {
    vi(p->data);
    p=p->next;
  }
  printf("\n");
  return OK;
}
Status compare(ElemType c1,ElemType c2)
{
  if(c1==c2)
    return TRUE;
  else
    return FALSE;
}
void visit(ElemType c)
{
  printf("%d ",c);
}
void main()
{
  LinkList L;
  ElemType e;
  int j;
  Status i;
  i=InitList_CL(&L); /* 初始化单循环链表L */
  printf("依次在单循环链表中插入3,5\n");
  ListInsert_CL(&L,1,3); /* 在L中依次插入3,5 */
  ListInsert_CL(&L,2,5);
  j=LocateElem_CL(L,5,compare);
  if(j)
    printf("L的第%d个元素为5。\n",j);
  else
    printf("不存在值为5的元素\n");
  i=ListDelete_CL(&L,2,&e);
  printf("删除L的第2个元素:\n");
  if(i)
  {
    printf("删除的元素值为%d,现在L中的数据元素依次为:",e);
    ListTraverse_CL(L,visit);
  }
  else
    printf("删除不成功!\n");
}
这是一个单循环链表  为什么 p=L->next->next; /* p指向第一个结点 */     p=(*L)->next,q; /* p指向头结点 */我不大明白,
还有就是删除节点函数里  Status ListDelete_CL(LinkList *L,int i,ElemType *e) 最后一个参数 ElemType *e  传值用的是指针
而在插入函数中Status ListInsert_CL(LinkList *L,int i,ElemType e) 相应的参数没有用指针?
搜索更多相关主题的帖子: 单循环 链表 
2010-04-12 09:53
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
这是为了把删除的节点中的值带回主函数,使你知道哪个数被删除了(应为节点删除后就没了,以后不能在链表中找到了)。而插入函数你插入以后就在链表中了,只要带回头指针就可以了。
2010-04-12 10:28
cxlttt
Rank: 1
等 级:新手上路
帖 子:16
专家分:7
注 册:2010-3-28
收藏
得分:0 
回复 2楼 草狼
谢谢
2010-04-13 10:41
快速回复:单循环链表的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012135 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved