//sList
#include <stdio.h> #include <stdlib.h> //===============状态量==================== #define OK 1 #define ERROR 0 //===================ADT 循环单链表 =============== typedef int ElemType; typedef struct CLNode{ ElemType data; struct CLNode *next; }CListNode; typedef CListNode *CLinkList; //================================模块定义============================== //内置申请节点函数 static CLinkList newNode(){ CLinkList p = (CLinkList)malloc(sizeof(CListNode)); if(p != NULL) p->next = NULL; return p; } //初始化 void InitList(CLinkList *L){ (*L) = newNode(); if(*L == NULL){ fprintf(stderr, "初始化失败!\n"); exit(EXIT_FAILURE); } (*L)->next = (*L); } //销毁表 void DestroyList(CLinkList L){ CLinkList p = L; CLinkList q = p->next; while(q != L){ free(p); p = q; q = p->next; } free(p); } //判断表空 int ListEmpty(CLinkList L){ return (L->next == L); } //求表长 int ListLength(CLinkList L){ CLinkList p = L; int i = 0; while(p->next != L){ i++; p = p->next; } return i; } //输出表 void DispList(CLinkList L){ CLinkList p = L->next; while(p != L){ printf("%d ", p->data); p = p->next; } printf("\n"); } //求下标为 i 的元素 int GetElem(CLinkList L, int i, ElemType *e){ int j = 0; CLinkList p = L; while(j < i && p->next != L){ p = p->next; } if(p == NULL) return ERROR; else{ *e = p->data; return OK; } } //求元素的下标 int LocateElem(CLinkList L, ElemType e){ int j = 0; CLinkList p = L; while(p->next != L && p->data != e){ j++; p = p->next; } if(p == L) return ERROR; else return j; } //插入元素 int InsertList(CLinkList L, int i, ElemType e){ CLinkList p = L; CLinkList pNew = NULL; int j = 0; if(p->next == L || i == 1){ //原链表为空表或者 i = 1时 pNew = newNode(); pNew->data = e; pNew->next = p->next; //因p的指针域会改变所以先连接后面 p->next = pNew; return OK; } else{ p = L->next; while(j < i - 2 && p != L){ //查找前驱节点 j++; p = p->next; } if(p == L) //i 输入错误 return ERROR; else{ pNew = newNode(); pNew->data = e; pNew->next = p->next; p->next = pNew; return OK; } } } //删除元素 int DeleteList(CLinkList L, int i, ElemType *e){ int j = 0; CLinkList p = L; CLinkList q = NULL; if(p->next == L){ //为空表时 return ERROR; } else{ if(i == 1){ q = p->next; *e = q->data; p->next = q->next; free(q); return OK; }//if else{ p = L->next; while(j < i - 2 && p != L){ j++; p = p->next; } if(p == L) return ERROR; else{ q = p->next; *e = q->data; p->next = q->next; free(q); return OK; } }//else }//else }