Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325575
  • 博文数量: 106
  • 博客积分: 3081
  • 博客等级: 中校
  • 技术积分: 1090
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-15 14:07
文章分类

全部博文(106)

文章存档

2009年(1)

2007年(34)

2006年(71)

我的朋友

分类:

2007-06-12 07:39:13


#include
#include
#include
#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
 
typedef int Status;
typedef int Boolean;
typedef int ElemType;
tpedef struct LNode
{
   ElemType data;
   struct LNode *next;
};
typedef struct LNode *LinkList;
/*即以后遇到LinkList就代表 struct LNode*/

void InitList(LinkList *L)
{
   *L=(LinkList)malloc(sizeof(struct LNode));
   if(!*L)
     exit(OVERFLOW);
   (*L)->next=NULL;
}
 void DestroyList(LinkList *L)
 {
   LinkList q;
   while(*L)
   {
     q=(*L)->next;
     free(*L);
     *L=q;
   }
 }
 void ClearList(LinkList L)
 {
   LinkList p,q;
   p=L->next;
   while(p)
   {
     q=p->next;
     free(p);
     p=q;
   }
   L->next=NULL;
 }
 Status ListEmpty(LinkList L)
 {
   if(L->next)
     return FALSE;
   else
     return TRUE;
 }
 int ListLength(LinkList L)
 {
   int i=0;
   LinkList p=L->next;
   while(p)
   {
     i++;
     p=p->next;
   }
   return i;
 }
 Status GetElem(LinkList L,int i,ElemType *e) /* 算法2.8 */
 {
   int j=1;
   LinkList p=L->next;
   while(p&&j   {
     p=p->next;
     j++;
   }
   if(!p||j>i)
     return ERROR;
   *e=p->data;
   return OK;
 }
 int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 {
   int i=0;
   LinkList p=L->next;
   while(p)
   {
     i++;
     if(compare(p->data,e))
       return i;
     p=p->next;
   }
   return 0;
 }
 Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e)
 {
   LinkList q,p=L->next;
   while(p->next)
   {
     q=p->next;
     if(q->data==cur_e)
     {
       *pre_e=p->data;
       return OK;
     }
     p=q;
   }
   return INFEASIBLE;
 }
 Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e)
 {
   LinkList p=L->next;
   while(p->next)
   {
     if(p->data==cur_e)
     {
       *next_e=p->next->data;
       return OK;
     }
     p=p->next;
   }
   return INFEASIBLE;
 }
 Status ListInsert(LinkList L,int i,ElemType e)
 {
   int j=0;
   LinkList p=L,s;
   while(p&&j   {
     p=p->next;
     j++;
   }
   if(!p||j>i-1)
     return ERROR;
   s=(LinkList)malloc(sizeof(struct LNode));
   s->data=e; /* 插入L中 */
   s->next=p->next;
   p->next=s;
   return OK;
 }
 Status ListDelete(LinkList L,int i,ElemType *e)
 {
   int j=0;
   LinkList p=L,q;
   while(p->next&&j   {
     p=p->next;
     j++;
   }
   if(!p->next||j>i-1)
     return ERROR;
   q=p->next;
   p->next=q->next;
   *e=q->data;
   free(q);
   return OK;
 }
 void ListTraverse(LinkList L,void(*vi)(ElemType))
 {
   LinkList p=L->next;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("\n");
 }
 Status equal(ElemType c1,ElemType c2)
 {
   if(c1==c2)
     return TRUE;
   else
     return FALSE;
 }
 int comp(ElemType a,ElemType b)
 {
   if(a==b)
     return 0;
   else
     return (a-b)/abs(a-b);
 }
 void print(ElemType c)
 {
   printf("%d ",c);
 }
 void print2(ElemType c)
 {
   printf("%c ",c);
 }
 void print1(ElemType *c)
 {
   printf("%d ",*c);
 }
 void main()
 { /* 除了几个输出语句外,主程和main2-1.c很像 */
   LinkList L; /* 与main2-1.c不同 */
   ElemType e,e0;
   Status i;
   int j,k;
   InitList(&L);
   for(j=1;j<=5;j++)
     i=ListInsert(L,1,j);
   printf("在L的表头依次插入1~5后:L=");
   ListTraverse(L,print); /* 依次对元素调用print(),输出元素的值 */
   i=ListEmpty(L);
   printf("L是否空:i=%d(1:是 0:否)\n",i);
   ClearList(L);
   printf("清空L后:L=");
   ListTraverse(L,print);
   i=ListEmpty(L);
   printf("L是否空:i=%d(1:是 0:否)\n",i);
   for(j=1;j<=10;j++)
     ListInsert(L,j,j);
   printf("在L的表尾依次插入1~10后:L=");
   ListTraverse(L,print);
   GetElem(L,5,&e);
   printf("第5个元素的值为:%d\n",e);
   for(j=0;j<=1;j++)
   {
     k=LocateElem(L,j,equal);
     if(k)
       printf("第%d个元素的值为%d\n",k,j);
     else
       printf("没有值为%d的元素\n",j);
   }
   for(j=1;j<=2;j++) /* 测试头两个数据 */
   {
     GetElem(L,j,&e0); /* 把第j个数据赋给e0 */
     i=PriorElem(L,e0,&e); /* 求e0的前驱 */
     if(i==INFEASIBLE)
       printf("元素%d无前驱\n",e0);
     else
       printf("元素%d的前驱为:%d\n",e0,e);
   }
   for(j=ListLength(L)-1;j<=ListLength(L);j++) /* 最后两个数据 */
   {
     GetElem(L,j,&e0); /* 把第j个数据赋给e0 */
     i=NextElem(L,e0,&e); /* 求e0的后继 */
     if(i==INFEASIBLE)
       printf("元素%d无后继\n",e0);
     else
       printf("元素%d的后继为:%d\n",e0,e);
   }
   k=ListLength(L); /* k为表长 */
   for(j=k+1;j>=k;j--)
   {
     i=ListDelete(L,j,&e); /* 删除第j个数据 */
     if(i==ERROR)
       printf("删除第%d个元素失败\n",j);
     else
       printf("删除第%d个元素成功,其值为:%d\n",j,e);
   }
   printf("依次输出L的元素:");
   ListTraverse(L,print);
   DestroyList(&L);
   printf("销毁L后:L=%u\n",L);
 }
阅读(947) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~