- #include <stdio.h>
- #include <malloc.h>
- typedef char ElemType;
- typedef struct LNode
- {
- ElemType data;
- struct LNode * next;
- }LinkList;
- LinkList *InitiaList()
- {
- LinkList *L;
- L = (LinkList *)malloc(sizeof(LinkList));
- L->next = NULL;
- return L;
- }
- void DestoryList1(LinkList * L)
- {
- LinkList *p = L,*q = p->next;
- while(q != NULL)
- {
- free(p);
- p = q;
- q = p->next;
- }
- free(p);
- }
- void SetNull(LinkList * L)
- {
- L->next = NULL;
- }
- int ListEmpty1(LinkList * L)
- {
- return (L->next == NULL);
- }
- int ListLength1(LinkList * L)
- {
- LinkList *P = L;
- int i = 0;
- while(P->next != NULL)
- {
- i ++;
- P = P->next;
- }
- return i;
- }
- ElemType GetElem1(LinkList * L,int i)
- {
- int j = 0;
- LinkList *p = L;
- ElemType e;
- while (j < i && p != NULL)
- {
- j ++;
- p = p->next;
- }
- if (p == NULL)
- {
- return ('F');
- }
- else
- {
- e = p->data;
- return e;
- }
- }
- int LocateElem1(LinkList * L,ElemType e)
- {
- LinkList *p = L->next;
- int n = 1;
- while(p != NULL && p->data != e)
- {
- p = p->next;
- n ++;
- }
- if (p == NULL)
- {
- return 0;
- }
- else
- {
- return n;
- }
- }
- ElemType PriorElem1(LinkList * L,ElemType cur_e)
- {
- LinkList *p = L->next;
- ElemType pre_e;
- if (p->data == cur_e)
- {
- return ('F');
- }
- else
- {
- while (p->next->data != cur_e)
- {
- p = p->next;
- }
- pre_e = p->data;
- return pre_e;
- }
- }
- ElemType NextElem1(LinkList * L,ElemType cur_e)
- {
- LinkList *p = L->next,*q;
- ElemType next_e;
- if (p == NULL)
- {
- return ('F');
- }
- else
- {
- while(p->data != cur_e)
- p = p->next;
- q = p->next;
- if (q != NULL)
- {
- next_e = q ->data;
- return next_e;
- }
- else
- {
- return ('F');
- }
- }
- }
- int ListInsert1(LinkList * L,int i,ElemType e)
- {
- int j = 0;
- LinkList *p = L,*s;
- while(j < i-1 && p != NULL)
- {
- j ++;
- p = p->next;
- }
- if (p == NULL || j > i-1)
- {
- return 0;
- }
- else
- {
- s = (LinkList *)malloc(sizeof(LinkList));
- s->data = e;
- s->next = p->next;
- p->next = s;
- return 1;
- }
- }
- ElemType ListDelete1(LinkList * L,int i)
- {
- int j = 0;
- LinkList * p = L,*q;
- ElemType e;
- while(j < i-1 && p != NULL)
- {
- j ++;
- p = p->next;
- }
- if (p == NULL || j > i-1)
- {
- return ('F');
- }
- else
- {
- q = p->next;
- if(q == NULL)
- return ('F');
- e = q->data;
- p->next = q->next;
- free(q);
- return e;
- }
- }
- void ListTraverse1(LinkList * L)
- {
- LinkList *p = L->next;
- while(p != NULL)
- {
- printf(" %c",p->data);
- p = p->next;
- }
- printf("\n");
- }
- void main()
- {
- ElemType e;
- LinkList * L = NULL;
- L = InitiaList();
- ListInsert1(L,1,'i');
- ListInsert1(L,2,'l');
- ListInsert1(L,3,'o');
- ListInsert1(L,4,'v');
- ListInsert1(L,5,'e');
- ListInsert1(L,6,'y');
- ListInsert1(L,7,'o');
- ListInsert1(L,8,'u');
- ListTraverse1(L);
- printf("\n");
- printf("单链表L的长度:%d\n",ListLength1(L));
- printf("元素y的位置:%d\n",LocateElem1(L,'y'));
- printf("单链表L为:%s\n",(ListEmpty1(L)?"空":"非空"));
- e = GetElem1(L,4);
- printf("单链表L的第4个元素:%c\n",e);
- e = PriorElem1(L,'y');
- printf("元素y的前驱元素:%c\n",e);
- e = NextElem1(L,'y');
- printf("元素y的后驱元素:%c\n",e);
- ListInsert1(L,5,'h');
- ListTraverse1(L);
- e = ListDelete1(L,5);
- ListTraverse1(L);
- SetNull(L);
- printf("单链表L为:%s\n",(ListEmpty1(L)?"空":"非空"));
- DestoryList1(L);
- printf("成功释放单链表\n");
- }
转载于:https://blog.51cto.com/591819849/1100767