普通链表实例(全)
来源:互联网 发布:叮当在线客服软件 编辑:程序博客网 时间:2024/06/17 00:13
链表的插入,删除,遍历等功能的实例
工程一共包含4个文件
1. Entity.h :声明表的元素的类型。可以是基本数据类型也可以是结构体
2. ChainList.h :定义表结构体,声明全局的宏定义,函数的声明
3. ChainList.c :具体的函数实现
4. main.c : 测试文件参考博客文章: http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html
参考博客文章: http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/
Entity.h
typedef struct{ char key[15]; //结点的关键字 char name[20]; int age; } DATA; //定义结点类型 可定义为简单类型或者结构体
ChainList.h
/* 头文件:数据结构的定义和操作原型 */ #include <stdio.h> #include "Entity.h" typedef struct Node{ DATA data; //数据域 struct Node *next; //指针域,指向下一个结点的地址 } ChainListType; ChainListType *ChainListAddEnd(ChainListType *head, DATA data); //添加结点到链表结尾 ChainListType *ChainListAddFirst(ChainListType *head, DATA data); //添加结点到头部 ChainListType *ChainListInsert(ChainListType *head, char *findKey, DATA data);//把数据插入链表(插入到某个关键字之后) ChainListType *ChainListFind(ChainListType *head, char *key); //按关键字查找 int ChainListDelete(ChainListType *head, char *key); //删除指定关键字的结点 int ChainListLength(ChainListType *head); //获取链表结点数量
ChainList.c
#include <string.h> #include <malloc.h> #include "ChainList.h" /*添加结点到链表结尾*/ ChainListType *ChainListAddEnd(ChainListType *head, DATA data){ ChainListType *node, *h; //临时变量 用于保存新结点的地址和链表当前(头结点和循环时候的)结点的地址(即head) if(! (node = (ChainListType *)malloc(sizeof(ChainListType)))){//申请赋予内存地址用来保存新结点 //如果失败 printf("申请内存失败\n"); return NULL; } //分配成功 node->data = data; //设置数据域 node->next = NULL; //设置指针域指向空(这是一个结点) //把新加的结点连接到链表 if(head == NULL){ //如果头结点为空 表示没有实际结点 head = node; //头结点指向这个新结点 printf("|||||"); ChainListLength(head); printf("|||||"); return head; }else{ //头结点不为空 遍历到达当前链表的最后一个结点 h = head; while(h->next != NULL){ h = h->next; } h->next = node;//到达最后一个结点 赋值 return head; } } /*添加结点到头部*/ ChainListType *ChainListAddFirst(ChainListType *head, DATA data){ ChainListType *node; //临时变量 用于保存新结点的地址和链表当前(头结点和循环时候的)结点的地址(即head) if(! (node = (ChainListType *)malloc(sizeof(ChainListType)))){//申请赋予内存地址用来保存新结点 //如果失败 printf("申请内存失败\n"); return NULL; } //分配成功 node->data = data; //设置数据域 node->next = head; //设置指针域指向原来头指针指向的地址 head = node; //头结点指向新增结点 return head; } /*把数据插入链表(插入到某个关键字之后)*/ ChainListType *ChainListInsert(ChainListType *head, char *findKey, DATA data){ ChainListType *node, *node1; //临时变量 用于保存新结点的地址 if(! (node = (ChainListType *)malloc(sizeof(ChainListType)))){//申请赋予内存地址用来保存新结点 //如果失败 printf("申请内存失败\n"); return NULL; } //分配成功 node->data = data; //设置数据域 node1 = ChainListFind(head, findKey); //查找指定关键字的结点 if(node1){ //如果找到该结点 node->next = node1->next; //把找到的结点的下一个结点的地址赋值给新结点 node1->next = node; //把找到的结点的指针域指向新结点 }else{ free(node); //释放内存 printf("没有找到结点"); } return head; } /*按关键字查找*/ ChainListType *ChainListFind(ChainListType *head, char *key){ ChainListType *h; h = head; while(h){ if(strcmp(h->data.key, key) == 0){ //字符串对比函数 相同则返回0 return h; } h = h->next; } return NULL; } /*删除指定关键字的结点*/ int ChainListDelete(ChainListType *head, char *key){ ChainListType *node, *h; //h指向循环当前结点 node指向h的前一个结点 node = h = head; while(h){ if(strcmp(h->data.key, key) == 0){ //字符串对比函数 相同则返回0 node->next = h->next; free(h); //释放 删除 return 1; }else{ node = h; //把h赋值给node h = h->next; //h指向h的下一个结点 } } return 0; } /*获取链表结点数量*/ int ChainListLength(ChainListType *head){ ChainListType *h; int i = 0; h = head; if(h == NULL){ printf("没有数据!!!"); return 0; } while(h){ h = h->next; i++; } return i; }
main.c
/* 测试文件:调用测试函数*/#include <stdio.h>#include "ChainList.h"/*遍历链表的数据*/void ChainListAll(ChainListType *head){ ChainListType *h; h = head; printf("链表所有的数据:\n"); while(h){ //判断当前结点的存在 printf("%s %s %d \t", h->data.key, h->data.name, h->data.age); h = h->next; } return;}int main(void){ ChainListType *node, *head = NULL; DATA data; int k, i; char key[15]; while(1){ fflush(stdin); printf("\n\n输入操作\n1.插入到末尾\t2.内容查询\t3.插入到头部\t4.插入到指定结点之后\t5.删除\t6.求长度\t7.遍历\t8.退出\n:"); scanf("%d", &k); if(k == 8){ break; } switch(k){ case 1: printf("插入到末尾:输入元素内容:"); scanf("%s %s %d", &data.key, &data.name, &data.age); head = ChainListAddEnd(head, data); printf("插入的元素为:(%s %s %d) \n", head->data.key, head->data.name, head->data.age); break; case 2: printf("输入元素key:"); scanf("%s", &key); node = ChainListFind(head, &key); printf("元素为:(%s %s %d) \n", node->data.key, node->data.name, node->data.age); break; case 3: printf("插入到头部:输入元素内容:"); scanf("%s %s %d", &data.key, &data.name, &data.age); head = ChainListAddFirst(head, data); printf("插入的元素为:(%s %s %d) \n", head->data.key, head->data.name, head->data.age); break; case 4: printf("插入到指定结点之后:输入位置元素key和元素内容:"); scanf("%s %s %s %d", &key, &data.key, &data.name, &data.age); head = ChainListInsert(head, &key, data); printf("插入的元素为:(%s %s %d) \n", head->data.key, head->data.name, head->data.age); break; case 5: printf("输入要删除的元素key:"); scanf("%s", &key); i = ChainListDelete(head, &key); if(i == 1){ printf("删除成功\n"); }else{ printf("删除失败\n"); } break; case 6: printf("-----%d------\n", ChainListLength(head)); break; case 7: ChainListAll(head); break; } } return 0;}
个人博客 欢迎来访: http://ay2626.me
阅读全文
0 0
- 普通链表实例(全)
- 顺序表实例(全)
- 队列实例(全)
- 普通链表
- 普通链表
- 普通链表 2
- 普通接口实例
- 链表的普通应用
- C++ 数据结构 *** 普通链表
- C++模版全掌握(实例)
- C++模版全掌握(实例)
- jQuery Ajax 实例 全解析(转载)
- jQuery Ajax 实例 全解析(转载)
- C++模版全掌握(实例)
- MySQL笔记复习(实例 全)
- (com组件)普通接口实例
- Mysql普通索引创建实例
- JAVA基础程序设计——初学JAVA代码片段(实例普通版+实例变态版)
- IO流、多线程、网络、XML以及反射的基本知识
- 【Java并发之】BlockingQueue
- 二维码生成扫描
- hadoop-3.0.0分布式部署与配置
- Spring-AOP概述
- 普通链表实例(全)
- LED室内定位算法:RSS,TOA,AOA,TDOA
- mysql 子查询
- JavaScript的location对象
- SSL证书验证(采用AFNetwork)
- DOM
- Ubuntu 安装 JDK 7 / JDK8 的两种方式
- 递归实现二分查找
- python繁體转为简体