链表的创建、插入、删除等操作
2017-06-19 11:19
405 查看
#include<stdio.h> #include<stdlib.h> #define T 1 #define F -1 typedef int Status; typedef int ElementType; struct Node { ElementType value; struct Node* next; }; Status init(struct Node** head); Status insert_head(struct Node* head, ElementType value); Status insert_tail(struct Node* head, ElementType value); Status insert_index(struct Node*head, ElementType value, int index); Status delete_index(struct Node* head, int index); Status delete_value(struct Node* head, ElementType value); Status update_index(struct Node*head, int index, ElementType value); void update_value(struct Node*head, ElementType old_value, ElementType new_value); void query_value(struct Node* head, ElementType value); Status query_index(struct Node* head, int index); int length(struct Node* head); void print(struct Node* head); int main() { int i; int ret = 0; struct Node* head = NULL; ret = init(&head); if (F == ret) { return 1; } for (i = 0; i < 10; i++) { insert_head(head, i); } for (i = 0; i < 10; i++) { insert_tail(head, i); } print(head); printf("length = %d\n", length(head)); delete_index(head, length(head) - 1); delete_index(head, 0); delete_index(head, 5); print(head); insert_index(head, 99, 5); insert_index(head, 99, 0); insert_index(head, 99, length(head)); print(head); delete_value(head, 0); print(head); update_index(head, 4, -1); print(head); update_value(head, 99, 100); print(head); query_value(head, 100); query_value(head, 99); query_index(head, 10); return 0; } Status 4000 init(struct Node** head) { struct Node* newnode = (struct Node*)malloc(sizeof(struct Node)); if (NULL == newnode) { return F; } newnode->value = 0; newnode->next = NULL; (*head) = newnode; return T; } Status insert_head(struct Node* head, ElementType value) { struct Node* newnode = (struct Node*)malloc(sizeof(struct Node)); if (NULL == newnode) { return F; } newnode->value = value; newnode->next = head->next; head->next = newnode; return T; } Status insert_tail(struct Node* head, ElementType value) { struct Node* newnode = (struct Node*)malloc(sizeof(struct Node)); if (NULL == newnode) { return F; } newnode->value = value; newnode->next = NULL; while (head->next != NULL) { head = head->next; } head->next = newnode; return T; } Status insert_index(struct Node*head, ElementType value, int index) { if (index < 0 || index > length(head)) { printf("out of range\n"); return F; } int i; for (i = 0; i < index; i++) { head = head->next; } struct Node* newnode = (struct Node*)malloc(sizeof(struct Node)); if (NULL == newnode) { return F; } newnode->value = value; newnode->next = head->next; head->next = newnode; return T; } Status delete_index(struct Node* head, int index) { if (index < 0 || index >= length(head)) { printf("out of range\n"); return F; } int i; for (i = 0; i < index; i++) { head = head->next; } struct Node* temp = head->next->next; free(head->next); head->next = temp; return T; } Status delete_value(struct Node* head, ElementType value) { int len = length(head); int i; for (i = 0; i < len; i++) { printf("i = %d value = %d\n", i, head->next->value); if (head->next->value == value) { struct Node* temp = head->next->next; free(head->next); head->next = temp; } else { head = head->next; } } return T; } Status update_index(struct Node*head, int index, ElementType value) { if (index < 0 || index >= length(head)) { printf("out of rangr\n"); return F; } int i; for (i = 0; i <= index; i++) { head = head->next; } head->value = value; return T; } void update_value(struct Node*head, ElementType old_value, ElementType new_value) { int i; while (head->next != NULL) { if (head->next->value == old_value) { head->next->value = new_value; } head = head->next; } } void query_value(struct Node* head, ElementType value) { int count = 0; int index = 0; while (head->next != NULL) { if (head->next->value == value) { count++; printf("find %d : %d\n", value, index); } head = head->next; index++; } if (0 == count) { printf("not found %d\n", value); } } Status query_index(struct Node* head, int index) { if (index < 0 || index >= length(head)) { printf("out of rangr\n"); return F; } int i; for (i = 0; i <= index; i++) { head = head->next; } printf("index = %d value =%d\n", index, head->value); return T; } int length(struct Node* head) { int count = 0; while (head->next != NULL) { count++; head = head->next; } return count; } void print(struct Node* head) { while (head->next != NULL) { printf("%d ", head->next->value); head = head->next; } printf("\n"); }
相关文章推荐
- C语言单向链表的创建、释放、插入、删除、翻转操作练习
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作
- C语言各种链表操作(创建、打印、删除、插入、反转)
- 链表的基础操作总结(链表创建,插入,删除,遍历等等)
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- 算法学习-数据结构之链表操作,创建,插入,删除,查找。
- 数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- 单向链表的操作:创建,删除,插入,销毁,查找
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)
- 链表创建、查询、删除、插入等操作
- 链表操作:创建,插入,删除,查找等功能
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 双向链表的有关操作(创建,遍历,插入,删除)
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 链表操作综合练习(创建、拆分、插入、删除、合并、打印、逆置)