• 线性链表(C语言实现)


    #include<stdio.h>
    #include<malloc.h>

    #define ERROR 0
    #define OK 1
    #define EQUAL 1
    #define OVERFLOW -1
    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10

    struct STU{
      char name[20];
      char stuno[10];
      int age;
      int score;
    }stu[50];
    typedef struct STU ElemType;

    struct LNODE
    {
      ElemType data;
      struct LNODE *next;
    };

    typedef struct LNODE LNode;
    typedef struct LNODE *LinkList;


    int init(LinkList *L)
    {
      *L=(LNode *)malloc(sizeof(LNode));
      if(!L)   exit(ERROR);
      (*L)->next=NULL;
      return OK;
    }/*init */


    int ListLength(LinkList L)
    {
      int j=0;
      while (L->next)
        {
          L=L->next;
          j++;
        }
      return j;
    }


    int GetElem(LinkList L,int i,ElemType *e)
    {
      LinkList p; int j;
      p=L->next;j=1;
      while(p&&j<i){
        p=p->next;++j;
      }
      if(!p||j>1)  return ERROR;
      *e=p->data;
      return OK;
    }


    int EqualList(ElemType *e1,ElemType *e2)
    {
      if (strcmp(e1->name,e2->name)==0)
        return 1;
      else
        return 0;
    }


    int Less_EqualList(ElemType *e1,ElemType *e2)
    {
      if (strcmp(e1->name,e2->name)<=0)
        return 1;
      else
        return 0;
    }


    int DeleteElem(LinkList L,int i)
    {
        LinkList p,q;  int j;
        j=0;
        p=L;
        while (p->next && j<i){
          q=p;p=p->next; ++j;
        }
        if(!p)  return ERROR;
        q->next=p->next;
        return OK;
    }

    ElemType* PriorElem(LinkList L,ElemType e)
    {
        int i;
        LinkList p,q;
       
        p=L;
        while (p->next)
        {
              q=p; p=p->next;
              /*printf("(p->data).stuno:%s",(p->data).stuno);*/
              /*printf("e.stuno:%s",e.stuno);*/
              if (strcmp((p->data).stuno,e.stuno)==0)
                 return &(q->data);
        }
        return NULL;
    }   


    int LocateElem(LinkList La,ElemType e,int type)
    {
      int i;
      LinkList p;
      p=La;
      switch (type)
        {
          case EQUAL:
       while(p->next)
         {
           p=p->next;
           if(EqualList(&p->data,&e))
            return 1;
         }
       return 0;
     break;
          default:
     break;
        }
      return 0;
    }

    void MergeList(LinkList La,LinkList Lb,LinkList *Lc)
    {
      LinkList pa,pb,pc;
      pa=La->next;pb=Lb->next;
      *Lc=pc=La;
      while(pa && pb)
        {
          if(Less_EqualList(&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);
    }

    int printlist(LinkList L)
    {
      int i;
      LinkList p;
      p=L;
      printf("name       stuno        age     score\n");
      while(p->next)
        {
          p=p->next;
          printf("%-10s %s\t%d\t%d\n",  p->data.name,  p->data.stuno,
       p->data.age,  p->data.score);
        }
      printf("\n");
    }

    int ListInsert(LinkList L,int i,ElemType e)
    {
      LinkList p,s;
      int j;
      p=L;j=0;
      while(p&&j<i-1)
        {
          p=p->next;
          ++j;
        }
      if(!p||j>i-1) return ERROR;
      s=(LinkList)malloc(sizeof(LNode));
      s->data=e;
      s->next=p->next;
      p->next=s;
      return OK;
    }/*ListInsert Before i */


    int main()
    {
      struct STU e,t,*p;
      LinkList La,Lb,Lc;

      printf("\n\n-------------------List Demo is running...----------------\n\n");
      printf("First is InsertList function.\n");
      init(&La);

      strcpy(e.name,"stu1");
      strcpy(e.stuno,"100001");
      e.age=80;
      e.score=1000;
      ListInsert(La,1,e);
      strcpy(e.name,"stu3");
      strcpy(e.stuno,"100002");
      e.age=80;
      e.score=1000;
      ListInsert(La,2,e);

      printlist(La);
      getch();

      strcpy(e.name,"stu5");
      strcpy(e.stuno,"100003");
      e.age=80;
      e.score=1000;
      ListInsert(La,3,e);
     
      printlist(La);
      getch();
     
      strcpy(t.name,"stu3");
      strcpy(t.stuno,"100002");
      t.age=80;
      t.score=1000;
      p=PriorElem(La,t);
      printf("p is the :%s\n\n",p->stuno);
      getch();
     
      strcpy(t.name,"stu5");
      strcpy(t.stuno,"100003");
      t.age=80;
      t.score=1000;
      p=PriorElem(La,t);
      printf("p is the :%s\n\n",p->stuno);
      getch();
     
      strcpy(t.name,"stu1");
      strcpy(t.stuno,"100001");
      t.age=80;
      t.score=1000;
      p=PriorElem(La,t);
      printf("p is the :%s\n\n",p->stuno);
      getch();
     
      printf("Test DeleteElem\n");
      DeleteElem(La,1);
      printlist(La);
      getch();

      init(&Lb);

      strcpy(e.name,"stu2");
      strcpy(e.stuno,"100001");
      e.age=80;
      e.score=1000;
      ListInsert(Lb,1,e);
      strcpy(e.name,"stu4");
      strcpy(e.stuno,"100002");
      e.age=80;
      e.score=1000;
      ListInsert(Lb,2,e);

      strcpy(e.name,"stu6");
      strcpy(e.stuno,"100001");
      e.age=80;
      e.score=1000;
      ListInsert(Lb,3,e);

      printlist(Lb);
      getch();

      MergeList(La,Lb,&Lc);
      printlist(Lc);
      getch();

      printf("\n\n\n\n\n\nWelcome to visit http://zmofun.heha.net !\n\n\n\n\n\n\n");
      getch();
      return 0;
    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/djcsch2001/archive/2009/03/06/3964660.aspx

  • 相关阅读:
    一个简单实现的遮罩层
    文字内容过长是自动出现省略号
    Maven入门学习(下)
    Maven入门学习(上)
    使用ODP.NET查询数据参数顺序问题及莫名ORA-01722错误提示
    Xamarin开发Android笔记:TextView行间距设定
    Xamarin开发Android笔记:图片切换ImageSwitcher
    Xamarin开发Android笔记:背景操作
    UI创意求助:手机贪吃蛇游戏方向控制键设计
    做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2035181.html
Copyright © 2020-2023  润新知