C语言:顺序表
来源:互联网 发布:画江湖之换世门生知乎 编辑:程序博客网 时间:2024/05/16 17:29
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,下面我们简单实现顺序表。
test.c中
#define _CRT_SECURE_NO_WARNINGS 1#include "seqlist.h"void menu(){printf("****************************\n");printf("1.PushBack 2.PopBack\n");printf("3.PushFront 4.PopFront\n");printf("5.Show 6.Remove \n");printf("7.RemoveAll 8.Sort \n");printf("9.BinarySearch 10.Find \n");printf("0.Exit \n");printf("****************************\n");}int main(){Seqlist mylist;int input = 0;InitSeqlist(&mylist);do{menu();printf("请选择:>");scanf("%d", &input);switch (input){DateTyPe data = 0;case 1:printf("请输入要插入的元素:>");scanf("%d", &data);PushBack(&mylist, data);break;case 2:PopBack(&mylist);break;case 3:printf("请输入要插入的元素:>");scanf("%d", &data);PushFront(&mylist, data);break;case 4:PopFront(&mylist);break;case 5:Show(&mylist);break;case 6:printf("请输入要查找的元素:>");scanf("%d", data);Remove(&mylist, data);break;case 7:printf("请输入要查找的元素:>");scanf("%d", data);RemoveAll(&mylist, data);break;case 8:Sort(&mylist);break;case 9:{ int ret = 0; printf("请输入要查找的元素:>"); scanf("%d", data); ret = BinarySearch(&mylist, data); if (ret == -1) { printf("查找的元素不存在\n"); } else { printf("元素下标为%d\n", ret); } break;}case 10:{ int ret2 = 0; ret2 = Find(&mylist, data); if (ret2 == -1) { printf("指定元素不存在\n"); } else { printf("元素下标是%d\n", ret2); }}break;case 0:break;default:printf("输入错误,请重新输入\n");break;}} while (input);DestroySeqlist(&mylist);system("pause\n");return 0;}
seplist.h中
#define _CRT_SECURE_NO_WARNINGS 1#ifndef __SEQLIST_H__#define __SEQLIST_H__#endif //__DEQLIST_H__#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<string.h>#define MAX 100#define DEFAULT_SZ 3#define INC_SZ 2typedef int DateTyPe;typedef struct Seqlist{int capacity;//容量int count;//有效DateTyPe *PData;//指向堆上的空间}Seqlist,*PSeqlist;void InitSeqlist(PSeqlist p);void DestroySeqlist(PSeqlist p);void CheckCapacity(PSeqlist p);void PushBack(PSeqlist p, DateTyPe d);//尾插void Show(PSeqlist p);void PopBack(PSeqlist);//尾删void PopFront(PSeqlist p);//头删void PushFront(PSeqlist p, DateTyPe d);//头插int Find(PSeqlist p,DateTyPe d);void Remove(PSeqlist p, DateTyPe d);void RemoveAll(PSeqlist p, DateTyPe d);int BinarySearch(PSeqlist p, DateTyPe d);void Destroy(PSeqlist p);void Sort(PSeqlist p);
seqlist.c中
#include"seqlist.h"void InitSeqlist(PSeqlist p)//初始化{p->PData = (DateTyPe *)malloc(DEFAULT_SZ * sizeof(DateTyPe)*MAX);if (p->PData == NULL){perror("malloc");return;}p->count = 0;p->capacity = DEFAULT_SZ;memset(p->PData, 0, sizeof(DateTyPe)*DEFAULT_SZ);}void CheckCapacity(PSeqlist p)//检查容量是否满{assert(p);DateTyPe *tmp = NULL;if (p->capacity == p->count){tmp = (DateTyPe *)realloc(p->PData, (p->capacity + INC_SZ)*sizeof(DateTyPe));if (tmp != NULL)//判断申请内存是否成功{p->PData = tmp;}}p->capacity += INC_SZ;}void DestroySeqlist(PSeqlist p)//销毁{assert(p != NULL);free(p->PData);}void Show(PSeqlist p)//展示{assert(p != NULL);int i = 0;for (i = 0; i < p->count; i++){printf("%d ", p->PData[i]);}printf("\n");}void PopBack(PSeqlist p)//后删{assert(p != NULL);if (p->count == 0){printf("顺序表为空\n");return;}p->count--;}void PushBack(PSeqlist p, DateTyPe d)//后插{CheckCapacity(p);p->PData[p->count] = d;p->count++;}void PushFront(PSeqlist p, DateTyPe d)//头插{int i = 0;assert(p != NULL);CheckCapacity(p);if (p->count == 0){p->PData = d;p->count++;}else{for (i = p->count; i > 0; i--){p->PData[i] = p->PData[i-1];}p->PData[0] = d;p->count++;}}void PopFront(PSeqlist p)//头删{int i = 0;assert(p != NULL);if (p->count == 0){printf("顺序表为空\n");return;}for (i = 0; i < p->PData; i++){p->PData[i] = p->PData[i+1];}p->count--;}int Find(PSeqlist p, DateTyPe d)//查找指定元素{int i = 0;assert(p != NULL);for (i = 0; i < p->count; i++){if (p->PData[i] == d){return i;}}return -1;}void Remove(PSeqlist p, DateTyPe d)//删除指定元素{int pos = 0;int i = 0;assert(p != NULL);if (p->count == 0){printf("顺序表为空\n");return;}if ((pos = Find(p, d) == -1)){printf("指定元素不存在\n");return;}for (i = pos; i < p->count - 1; i++){p->PData[i] = p->PData[i+1];}p->count--;}void RemoveAll(PSeqlist p, DateTyPe d)//删除所有的某个元素{int pos = 0;int i = 0;assert(p != NULL);while ((pos = Find(p, d)) != -1){for (i = pos; i < p->count - 1; i++){p->PData[i] = p->PData[i+1];}p->count--;}}void Sort(PSeqlist p){int i = 0;int j = 0;for (i = 0; i < p->count - 1; i++){for (j = 0; j < p->count - 1 - i; j++){if (p->PData[j] > p->PData[j + 1]){DateTyPe tmp = p->PData[j];p->PData[j] = p->PData[j + 1];p->PData[j + 1] = tmp;}}}}int BinarySearch(PSeqlist p, DateTyPe d){int i = 0;int mid = 0;int left = 0;int right = p->count - 1;while (left <= right){mid = left - (left - right) / 2;if (p->PData[mid] > d){right = mid - 1;}else if (p->PData[mid] < d){left = mid + 1;}elsereturn mid;}return -1;}部分结果显示如下:
2 0
- 【C语言】顺序表
- 顺序表 - C语言
- C语言:顺序表
- C语言顺序表
- C语言顺序表
- 【顺序表】 c语言的顺序表
- C语言实现顺序表
- 顺序表c语言实现
- c语言实现顺序表
- 顺序表(C语言)
- C语言数据结构-顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- 【C语言】顺序表,数组
- C语言实现顺序表
- Leetcode twosum
- 安装SQuirrel SQL Client连接Phoenix操作HBase
- jzoj 5001. 【NOI2017模拟3.4】Trie树 状压dp
- 利用摄像头拍照并保存
- 一个基于Behave框架的http接口测试实例
- C语言:顺序表
- Java常用设计模式
- 算法入门---java语言实现的冒泡排序小结
- [点分治 离线] BZOJ 4449 [Neerc2015]Distance on Triangulation
- PCA
- 1066. 图像过滤(15)
- MongoDB的聚集分析
- WPF 更改StartupUri方式
- JSP内置对象之域对象