數(shù)據(jù)結(jié)構(gòu)教程第十二課實(shí)驗(yàn)二循環(huán)鏈表實(shí)驗(yàn)

字號:

本課主題: 實(shí)驗(yàn)二 循環(huán)鏈表實(shí)驗(yàn)
    教學(xué)目的: 掌握單向鏈表的實(shí)現(xiàn)方法
    教學(xué)重點(diǎn): 單向鏈表的存儲表示及操作
    教學(xué)難點(diǎn): 單向鏈表的操作實(shí)現(xiàn)
    授課內(nèi)容:
    一、單向鏈表的存儲表示
    C源程序
    #include
    #include
    #include
    #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 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 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 {
     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 */
    main()
    {
     struct STU e;
     LinkList La,Lb,Lc;
     clrscr();
     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();
     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");
    }
    二、單向鏈表的基本操作C源程序#include
    #include
    #include
    #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 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 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 {
     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 */
    main()
    {
     struct STU e;
     LinkList La,Lb,Lc;
     clrscr();
     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();
     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");
    }