线性表的C语言实现
2016-08-07 00:01
232 查看
函数声明头文件:function.h
#define true 1 #define false 0 /* 定义链表的数据类型为int型 */ typedef int datatype; /*线性表的单链表存储结构*/ typedef struct l_node { /*声明数据域*/ datatype data; /*声明指针域*/ struct l_node *next; }l_node, *link_list; /* 判断第i个元素是否存在 * 若存在,把该元素的值赋给*e,并返回true * 若不存在,返回false * 参数HEAD为单链表的头指针 */ int get_elem(link_list HEAD, int i, datatype *e); /* 在带头结点的单链线性表HEAD中,在第i个位置之前插入元素e * 参数HEAD是单链表的头指针 */ int list_insert_posision(link_list HEAD, int i,datatype e); /* 在带头结点的单链线性表HEAD中,删除第i个元素,并由e返回其值 * 参数HEAD是单链表的头指针头指针 */ int list_delete_position(link_list HEAD, int i, datatype *e); /* 创建新的链表,并插入输入的n个元素(插入元素的位置为1) * 参数HEAD为链表的头指针 * 参数n为插入元素的个数 */ void create_list(link_list HEAD, int n); /* 将两个链表并为一个有序链表 * 参数HEAD_A为链表A的头指针(元素按非递减排列) * 参数HEAD_B为链表B的头指针(元素按非递减排列) * 参数HEAD_C为合成链的头指针 */ void merge_list(link_list HEAD_A, link_list HEAD_B, link_list HEAD_C); /* 若链表为空,返回true,否则返回false * 参数HEAD为链表的头指针 */ int list_empty(link_list HEAD); /* 获取链表的长度 */ int list_length(link_list HEAD); /*在表中查找第k个元素,若找到,返回该元素的指针 * 否则返回空指针NULL * 参数HEAD为单链表的头指针 */ link_list list_locate(link_list HEAD, int k); /* 遍历单链表 */ void list_print(link_list HEAD); /* 在表中查找第一个值为k的结点 * 若找到返回位置索引(从1开始) * 否则,返回0 */ int list_locate_pos(link_list HEAD, datatype k); /* 销毁链表 */ void list_destory(link_list HEAD);
函数实现文件:implementation.c
#include<stdio.h> #include<stdlib.h> #include"function.h" int get_elem(link_list HEAD, int i, datatype *e) { /* 初始化第一个结点 */ link_list p = NULL; p = HEAD -> next; /* 计数器 */ int j = 1; /* 指针向后查找,直到p指向第i个元素或者p为空 */ while(p && j < i ) { p = p -> next; j += 1; } /* 若L为空 或 j > i,说明不存在*/ if (!p || j > i) { return false; } /* 否则说明找到第i个元素 */ *e = p -> data; return true; } int list_insert_posision(link_list HEAD,int i, datatype e) { /* 单链表的第一个结点 */ link_list p = NULL; p = HEAD; /* 初始化计数器 */ int j = 0; /* 指针向后查找,直到指针指向第(i-1)个元素或者p为空 */ while( p && (j < i - 1) ) { p = p -> next; j += 1; } /* 若i小于1或者i大于链表的changdu */ if ( !p || (j > i - 1) ) { return false; } /* 插入元素 */ /* 生成新结点 */ link_list new_node = (link_list) malloc(sizeof(l_node)); new_node -> data = e; /* 改变指针域 */ new_node -> next = p -> next; p -> next = new_node; return true; } int list_delete_position(link_list HEAD, int i, datatype *e) { /* 初始化第一个结点p */ link_list p = NULL; p = HEAD; /* 计数器 */ int j = 0; /* 指针向后查找,直到指针指向第(i-1)个元素或者p为空 */ while( p -> next && j < i - 1) { p = p -> next; j += 1; } /* 若i小于1或者i大于链表的长度 */ if ( !(p -> next) || j > i - 1 ) { return false; } /* 返回其值 */ *e = p -> next -> data; /* 删除结点 */ link_list q = p -> next; p -> next = q -> next; free(q); return true; } void create_list(link_list HEAD, int n) { int i = 0; /* 初始化头指针 */ HEAD -> next = NULL; for (i = 0; i < n; i++) { /* 新建结点 */ link_list p = (link_list) malloc(sizeof(l_node)); /* 输入结点值 */ scanf("%d",&(p -> data)); /* 改变指针域 */ p -> next = HEAD -> next; HEAD -> next = p; } } void merge_list(link_list HEAD_A, link_list HEAD_B, link_list HEAD_C) { /* 用L_A的头结点作为合成链表L_C的头结点 */ HEAD_C = HEAD_A; link_list pa, pb, pc; pa = HEAD_A -> next; pb = HEAD_B -> next; /* pc为合成链的尾指针 */ pc = HEAD_C; while(pa && pb) { if(pa -> data <= pb -> data) { pc -> next = pa; pc = pa; pa = pa -> next; } else { pc -> next = pb; pc = pb; pb = pb -> next; } } /* 插入剩余段 */ pc -> next = pa?pa:pb; /* 释放链表B的根节点 */ free(HEAD_B); } int list_empty(link_list HEAD) { if (HEAD -> next == NULL) return true; else return false; } int list_length(link_list HEAD) { /* 计数器 */ int count = 0; link_list p = HEAD -> next; while(p) { count += 1; p = p -> next; } return count; } link_list list_locate(link_list HEAD, int k) { /* 单链表的第一个结点 */ link_list p = HEAD -> next; /* 计数器 */ int i = 1; while(p && i < k) { p = p -> next; i += 1; } /* 存在第k个元素,且指针p指向该元素 */ if (p && i == k) { return p; } return NULL; } void list_print(link_list HEAD) { printf("打印单链表\n"); link_list p = HEAD -> next; while(p) { printf("%d\n", p -> data); p = p -> next; } } int list_locate_pos(link_list HEAD, datatype k) { /* 指针p指向链表的第一个结点 */ link_list p = HEAD -> next; /* 计数器 */ int i = 1; while(p) { if(p -> data == k) return i; p = p -> next; i += 1; } return 0; } void list_destory(link_list HEAD) { while(HEAD) { link_list p = HEAD; HEAD = HEAD -> next; free(p); } }
相关文章推荐
- C语言 栈的线性表示和实现 栈的实现和表示
- 线性表数据结构C语言实现
- 线性表的顺序实现(c语言)
- 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.
- 线性表的C语言实现
- C语言实现线性结构创建动态链表的学习心得(一)
- 线性表的顺序方式实现(c语言)
- 线性表的顺序表示及实现(C语言编写)
- C语言实现线性表
- C语言实现线性表连续存储结构相关算法
- 线性表的顺序表示(C语言实现)
- 开放定址散列表(线性探测法)实现文件C语言
- 线性表的顺序表示和实现(C语言描述)
- 线性链表的表示以及实现(C语言编写)
- C语言实现线性表之具体实现
- 线性查找算法的C语言实现
- 线性表——链式结构(c语言实现)
- 再散列开放定址散列表(线性探测法)加强版可再散列经优化实现文件C语言
- 严蔚敏版《数据结构》第二章线性表的算法C语言实现
- C语言实现线性表之链表算法