【数据结构与算法】(二) c 语言链表的简单操作
2017-06-29 15:59
736 查看
// // main.c // testLink // // Created by lan on 16/3/6. // Copyright © 2016年 lan. All rights reserved. // #include <stdio.h> #include <malloc/malloc.h> #include <stdlib.h> #include <stdbool.h> typedef struct Node { int date; // 数据域 struct Node * pNext; // 指针域 }NODE, * PNODE; PNODE create_list(void); // 创建一个链表 void traverse_link(PNODE); // 遍历链表 bool is_empty(PNODE pHead); int length_list(PNODE); bool insert_list(PNODE, int, int); bool delete_list(PNODE, int, int *); void sort_list(PNODE); int main(int argc, const char * argv[]) { int val; // 存放删除节点的值 PNODE pHead = NULL; pHead = create_list(); printf("创建好的链表: "); traverse_link(pHead); bool isEmpty = is_empty(pHead); printf("链表是否为空 = %d\n", isEmpty); int length = length_list(pHead); printf("链表的节点数 = %d\n", length); insert_list(pHead, 3, 99); printf("在第 3 个节点插入 99: "); traverse_link(pHead); delete_list(pHead, 4, &val); printf("删除第 4 个节点: "); traverse_link(pHead); printf("删除了 = %d\n", val); sort_list(pHead); printf("降序: "); traverse_link(pHead); return 0; } PNODE create_list() { int len; // 节点个数 int value; // 暂时存放节点的值 PNODE pHead = (PNODE)malloc(sizeof(NODE)); if (NULL == pHead) { printf("分配失败。程序终止!\n"); exit(-1); } PNODE pTail = pHead; pTail->pNext = NULL; printf("请输入创建链表节点的个数: "); scanf("%d", &len); for (int i = 0; i < len; i++) { printf("请输入第%d个节点值: ", i+1); scanf("%d", &value); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("分配失败,程序终止!\n"); exit(-1); } pNew->date = value; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } void traverse_link(PNODE pHead) { PNODE p = pHead->pNext; while (NULL != p) { printf("%d ", p->date); p = p->pNext; } printf("\n"); } bool is_empty(PNODE pHead) { if (NULL == pHead->pNext) { return true; } else { return false; } } int length_list(PNODE pHead) { int len = 0; PNODE p = pHead->pNext; while (NULL != p) { len++; p = p->pNext; } return len; } bool insert_list(PNODE pHead, int pos, int value) { // if (pos > length_list(pHead) || pos <= 0) { // return false; // } // PNODE pNew = (PNODE)malloc(sizeof(NODE)); // if (NULL == pNew) { // printf("分配失败。程序终止!\n"); // exit(-1); // } // pNew->date = value; // // PNODE p = pHead->pNext; // for (int i = 1; i < pos - 1; i++) { // p = p->pNext; // } // // PNODE q = p->pNext; // p->pNext = pNew; // pNew->pNext = q; // return true; // 一种更高效的实现方式 PNODE p = pHead; int i = 0; while (p != NULL && i < pos - 1) { p = p->pNext; i++; } if (p == NULL || i > pos - 1) { return false; } PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("分配失败,程序终止!\n"); exit(-1); } pNew->date = value; PNODE q = p->pNext; p->pNext = pNew; pNew->pNext = q; return true; } bool delete_list(PNODE pHead, int pos, int * pValue) { // if (pos > length_list(pHead) || pos <= 0) { // return false; // } // PNODE p = pHead->pNext; // for (int i = 1; i < pos - 1; i++) { // p = p->pNext; // } // // PNODE q = p->pNext; // *pValue = q->date; // p->pNext = p->pNext->pNext; // free(q); // q = NULL; // return true; // 一种更高效的实现方式 PNODE p = pHead; int i = 0; while (NULL != p->pNext && i < pos - 1) { p = p->pNext; i++; } if (NULL == p->pNext || i > pos - 1) { return false; } PNODE q = p->pNext; *pValue = q->date; p->pNext = p->pNext->pNext; free(q); // 记得释放 q 所指向的结构体 q = NULL; // 并把 q 指针指向 NULL return true; } void sort_list(PNODE pHead) { int i,j,temp,len; PNODE p,q; // int a[7] = {2,5,3,1,7,4,9}; // len = 7; // for (i = 0; i < len - 1; i ++) { // for (j = i + 1; j < len; j++) { // if (a[i] < a[j]) { // temp = a[i]; // a[i] = a[j]; // a[j] = temp; // } // } // } // // 打印输出 // for (int i = 0; i < 7; i ++) { // printf("%d ", a[i]); // } // printf("\n"); // 仿照数组的排序来实现链表的排序 len = length_list(pHead); for (i = 0, p = pHead->pNext; i < len - 1; i++,p = p->pNext) { for (j = i + 1, q = p->pNext; j < len; j++, q = q->pNext) { if (p->date < q->date) { temp = p->date; p->date = q->date; q->date = temp; } } } }
输出结果:
请输入创建链表节点的个数: 5 请输入第1个节点值: 1 请输入第2个节点值: 2 请输入第3个节点值: 3 请输入第4个节点值: 4 请输入第5个节点值: 5 创建好的链表: 1 2 3 4 5 链表是否为空 = 0 链表的节点数 = 5 在第 3 个节点插入 99: 1 2 99 3 4 5 删除第 4 个节点: 1 2 99 4 5 删除了 = 3 降序: 99 5 4 2 1 Program ended with exit code: 0
相关文章推荐
- 【数据结构与算法】(二) c 语言链表的简单操作
- 【数据结构与算法】(一) c 语言实现数组的简单操作
- Java数据结构与算法之单链表及简单操作
- 【数据结构与算法】(六) c 语言实现简单的二叉树静态创建及先序、中序、后序遍历
- 【数据结构与算法】java链表操作
- 数据结构与算法-链表的基本操作---ShinPans
- 数据结构实验一--单链表的基本操作的算法
- 数据结构之链表基本操作算法演示
- 【数据结构与算法】(四) c 语言静态队列的简单实现
- 数据结构与算法(4)---Java语言实现:队列的单链表定义
- 【数据结构与算法】(三) c 语言栈的简单实现
- 算法与数据结构基础7:C++双链表的简单实现
- 算法学习-数据结构之链表操作,创建,插入,删除,查找。
- 数据结构与算法面试题汇编(1)- 链表的操作与应用
- 数据结构之链表与数组(二) -单向链表上的简单操作问题
- php学习第一章:PHP基础语法(三)数据结构与算法:2、单向链表
- linux下用mython语言写的简单zeromq push/pull模式操作mysql数据
- 数据结构与算法之—链表(二) 有序单链表合并
- .net 数据结构与算法基础:泛型链表使用
- [数据结构算法学习] 单向链表