这是在上数据结构课程时候的练习,以后拿过来随时用。
- #include <stdio.h>
- #include <malloc.h>
- #include <string.h>
- #include <math.h>
- #include <stdlib.h>
- typedef int elemtype;
- #define TRUE 0
- #define FALSE 1
- #define OK 1
- #define ERROR 0
- #define INFEASIBLE -1
- #if(1)
- typedef struct LNode
- {
- struct LNode *next;
- int date;
- }*LinkList;
- //typedef LNode *LinkList;
- #endif
- #if(0)
- typedef struct LNode
- {
- struct LNode *next;
- elemtype data;
- };
- #endif
- void InitList(LinkList L)
- {
- L = (LinkList)malloc(sizeof(struct LNode));
- if(!L)
- {
- exit(-1);
- }
- 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; //p = L的话就销毁了链表相当于DestroyList
- while(p)
- {
- q = p->next;
- free(p);
- p = q;
- }
- L->next = NULL;
- }
- int ListEmpty(LinkList L)
- {
- if(L->next)
- {
- return FALSE;
- }
- return TRUE;
- }
- int ListLength(LinkList L)
- {
- int i = 0;
- LinkList p = L->next; //应该设立一个新的指针代替L,
- while(p)
- {
- i++;
- p = p->next;
- }
- return i;
- }
- int GetElem(LinkList L,int i,elemtype *e)
- {
- int j;
- LinkList p;
- p = L;
- for(j = 0; j < i; j++)
- {
- p = p->next;
- }
- if(!p)
- {
- return ERROR;
- }
- *e = p->date;
- return OK;
- }
- int LocateElem(LinkList L,elemtype *e)
- {
- int i = 0;
- LinkList p;
- p = L->next;
- while(p)
- {
- i++;
- if(p->date == *e)
- {
- return i;
- }
- p = p->next;
- }
- return 0;
- }
- int PriorElem(LinkList L,elemtype cur_e,elemtype *pre_e)
- {
- LinkList p,q;
- p = L->next;
- while(p->next)
- {
- q = p->next;
- if(q->date == cur_e)
- {
- *pre_e = p->date;
- return OK;
- }
- p = q;
- }
- return INFEASIBLE;
- }
- int NextElem(LinkList L,elemtype *next_e)
- {
- LinkList p; //remember it
- p = L->next;
- while(p->next)
- {
- if(p->date == cur_e)
- {
- *next_e = p->next->date;
- return OK;
- }
- p = p->next;
- }
- return INFEASIBLE;
- }
- int ListInsert(LinkList L,elemtype e)
- {
- int j = 1;
- LinkList p = L,s;
- if(i < 1)
- {
- return ERROR;
- }
- s = (LinkList)malloc(sizeof(struct LNode));
- s->date = e;
- if(i == 1)
- {
- s->next = L;
- L = s;
- }
- else
- {
- while(p && j < i - 1)
- {
- p = p->next;
- j++;
- }
- if(!p)
- {
- return ERROR;
- }
- s->next = p->next;
- p->next = s;
- }
- return OK;
- }
- int ListDelete(LinkList L,elemtype *e)
- {
- int j = 1;
- LinkList p = L->next;
- LinkList q = L;
- while(j < i)
- {
- p = p->next;
- q = q->next;
- j++;
- }
- if(!p || j >= i)
- {
- return ERROR;
- }
- q->next = p->next;
- *e = p->date;
- free(p);
- return OK;
- }
- void ListTraverse(LinkList L)
- {
- LinkList q = L;
- while(q)
- {
- printf("%d ",q->date);
- q = q->next;
- }
- //printf("\n\n");
- }
- #if(0)
- void main()
- { // 除了几个输出语句外,主程序和main2-1.cpp很像
- LinkList L = NULL; // 与main2-1.cpp不同
- elemtype e,e0;
- int 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(),输出元素的值
- i = ListEmpty(L);
- printf("L是否空:i=%d(1:是0:否)\n",i);
- ClearList(L);
- printf("清空L后:L=");
- ListTraverse(L);
- 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);
- GetElem(L,5,&e);
- printf("第5个元素的值为%d\n",e);
- for(j=0; j<=1; j++)
- {
- k = LocateElem(L,&j);
- if(k)
- {
- printf("第%d个元素的值为%d\n",k,j);
- }
- else
- {
- printf("没有值为%d的元素\n",j);
- }
- }
- for(j=1;j<=2;j++) // 测试头两个数据
- {
- GetElem(L,&e0); // 把第j个数据赋给e0
- i = PriorElem(L,e0,&e); // 求e0的前驱
- if(i == INFEASIBLE)
- printf("元素%d无前驱\n",e0);
- else
- printf("元素%d的前驱为%d\n",e);
- }
- for(j=ListLength(L)-1; j<=ListLength(L); j++) // 最后两个数据
- {
- GetElem(L,&e0); // 把第j个数据赋给e0
- i=NextElem(L,&e); // 求e0的后继
- if(i == INFEASIBLE)
- {
- printf("元素%d无后继\n",e0);
- }
- else
- {
- printf("元素%d的后继为%d\n",e);
- }
- }
- k = ListLength(L); // k为表长
- for(j=k+1; j>=k; j--)
- {
- i = ListDelete(L,&e); // 删除第j个数据
- if(i == ERROR)
- {
- printf("删除第%d个元素失败\n",j);
- }
- else
- {
- printf("删除第%d个元素成功,其值为%d\n",e);
- }
- }
- printf("依次输出L的元素:");
- ListTraverse(L);
- DestroyList(L);
- printf("销毁L后:L=%u\n",L);
- }
- #endif
- void main()
- {
- LinkList L = NULL;
- int i,j;
- InitList(L);
- for(j=1; j<=5; j++)
- {
- i = ListInsert(L,j);
- }
- printf("在L的表头依次插入1~5后:L=");
- ListTraverse(L); // 依次对元素调用print(),输出元素的值
- }