【数据结构】数据结构C语言的实现(单链表)
2016-12-17 13:25
716 查看
单链表
/* * 单链表 */ #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Elemtype; typedef int Status; typedef struct LNode { Elemtype data; // 元素数据 struct LNode *next; // 指向下一个元素的指针 } LNode, *LinkList; // 初始化链表 void InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(LNode)); if (!L) exit(OVERFLOW); (*L)->next = NULL; } // 销毁链表 void DestroyList(LinkList *L) { LinkList temp; while (*L) { temp = (*L)->next; free(*L); *L = temp; } } // 清空链表 void ClearList(LinkList L) { LinkList p = L->next; L->next = NULL; DestroyList(&p); } // 判断链表是否为空 Status isEmpty(LinkList L) { if (L->next) return FALSE; else return TRUE; } // 获取链表长度 int GetLength(LinkList L) { int i = 0; LinkList p = L->next; while (p) { i++; p = p->next; } return i; } // 获取链表第i个元素 Status GetElem(LinkList L, int i, Elemtype *e) { int j = 1; LinkList p = L->next; while (p && j < i) { j++; p = p->next; } if (!p || j > 1) return ERROR; *e = p->data; return OK; } // 比较两个元素 Status compare(Elemtype e1, Elemtype e2) { if (e1 == e2) return 0; else if (e1 < e2) return -1; else return 1; } // 返回元素e的index int FindElem(LinkList L, Elemtype e, Status (*compare)(Elemtype, Elemtype)) { int i = 0; LinkList p = L->next; while (p) { i++; if (!compare(p->data, e)) return i; p = p->next; } return -1; } // 返回前一个元素(如果有的话) Status PreElem(LinkList L, Elemtype cur_e, Elemtype *pre_e) { LinkList q, p = L->next; while (p->next) { q = p->next; if (q->data == cur_e) { *pre_e = p->data; return OK; } p = q; } return ERROR; } // 返回下一个元素(如果有的话) Status NextElem(LinkList L, Elemtype cur_e, Elemtype *next_e) { LinkList q, p = L->next; while (p->next) { if (p->data == cur_e) { *next_e = p->next->data; return OK; } p = p->next; } return ERROR; } // 在index = i处插入元素e Status InsertElem(LinkList L, int i, Elemtype e) { int j = 0; LinkList s, p = L; // 让p指向第i-1个元素 while (p && j < i - 1) { j++; p = p->next; } if (!p || j > i - 1) return ERROR; // 在第i个位置插入元素e s = (LinkList)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return OK; } // 删除第i个元素,被删除的元素通过指针*e返回 Status DeleteElem(LinkList L, int i, Elemtype *e) { int j = 0; LinkList q, p = L; // 让p指向第i-1个元素 while (p->next && j < i - 1) { j++; p = p->next; } if (!p->next || j > i - 1) return ERROR; // 删除第i个元素 q = p->next; p->next = q->next; *e = q->data; free(q); return OK; } // 访问元素 void visit(Elemtype e) { printf("%d ", e); } // 遍历线性表 void TraverseList(LinkList L, void (*visit)(Elemtype)) { LinkList p = L->next; while (p) { visit(p->data); p = p->next; } } /* * 主函数测试 */ int main() { LinkList L; InitList(&L); Elemtype e; int i; if (L) printf("init success\n"); if (isEmpty(L)) printf("list is empty\n"); for (i = 0; i < 10; i++) InsertElem(L, i + 1, i); if (GetElem(L, 1, &e)) printf("The first element is %d\n", e); printf("length is %d\n", GetLength(L)); printf("The 5 at %d\n", FindElem(L, 5, *compare)); PreElem(L, 6, &e); printf("The 6's previous element is %d\n", e); NextElem(L, 6, &e); printf("The 6's next element is %d\n", e); DeleteElem(L, 1, &e); printf("delete first element is %d\n", e); printf("list:"); TraverseList(L, visit); DestroyList(&L); if (!L) printf("\ndestroy success\n"); }
init success list is empty The first element is 0 length is 10 The 5 at 6 The 6's previous element is 5 The 6's next element is 7 delete first element is 0 list:1 2 3 4 5 6 7 8 9 destroy success
相关文章推荐
- 数据结构C语言之单链表简单实现
- 数据结构c语言实现之单链表的应用
- 数据结构C语言单链表的实现和几点注意的问题
- 数据结构中单链表的实现+单链表的C语言实现源代码
- 数据结构--单链表c语言实现
- 数据结构C语言实现系列——线性表
- 《数据结构》中的哈希表实现的例子(C语言)
- C语言实现数据结构中的链栈
- C语言实现数据结构中的链队列
- 顺序表的链式结构中用C语言实现单链表的交并差运算
- 单链表操作演示----C语言实现
- 数据结构C语言实现系列——线性表
- C语言实现数据结构中的顺序表
- 数据结构的Java实现——单链表
- 关于数据结构的10个面试题(c语言实现)
- 链表的C语言实现之单链表的实现
- 数据结构C语言实现系列——线性表
- C语言实现数据结构中的循环链表
- 数据结构C语言实现系列——队列
- 数据结构C语言实现系列——队列