zoukankan      html  css  js  c++  java
  • 顺序表的C、C++实现

    一个线性表表实现,函数声明放在 line_list.h 头文件汇总,函数定义放在line_list.c 中,main.c 用来测试各个函数.

    1.文件 line_list.h

    //  line_list.h
    #ifndef __LINE_LIST_H__
    #define __LINE_LIST_H__
    
    
    typedef int EleType;
    
    typedef struct {
    	EleType* pData;	//定义成指针,可以存放任意类型
    	unsigned int num;
    	unsigned int maxlength;   //线性表最大长度
    	
    }List;
    
    List* CreateList(const int );	//创建线性表
    void DestoryList(List*);	//删除线性表
    void ClearList(List*);	//清空线性表
    int ListAppend(List*, EleType);	 // 追加元素
    int IsEmpty(List *);	//判空
    int IsFull(List *);		//判满
    int ListDelete(List *,unsigned int);	//删除元素
    int GetElement(List *,unsigned int,EleType *);	// 取元素
    int ListInsert(List *,unsigned int ,EleType );   //插入元素
    int TraverseList(List *,int (*)(EleType * ));  //遍历线性表
    
    #endif
    
    1. 文件 line_list.c
    // line_list.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "line_list.h"
    
    
    //创建线性表, maxlength为线性表最大长度
    List* CreateList(const int maxlength)
    {
    	List* ls = (List*)malloc(sizeof(List));
    	if(NULL != ls)
    	{
    		ls->pData = (EleType*)malloc((maxlength )*sizeof(EleType));
    		if(NULL != ls->pData)
    		{
    			ls->maxlength = maxlength;
    			ls->num = 0;
    			return ls;
    		}
    	}
    	printf("out of place.
    ");
    	return NULL;
    }
    
    //删除线性表
    void DestoryList(List* ls)
    {
    	free(ls->pData);
    	free(ls);
    }
    
    	//清空线性表
    void ClearList(List* ls)
    {
    	ls->num = 0;
    }
    
    
    
    //判空,,线性表为空返回 1 ,否则返回 0
    int IsEmpty(List* ls)
    {
    	return (0 == ls->num);
    }
    
    
    //判满,线性表已满返回 1 ,否则返回 0
    int IsFull(List* ls)
    {
    	return (ls->num == ls->maxlength);
    }
    
    
    // 在末尾追加元素,成功返回1,失败返回0
    int ListAppend(List* ls, EleType ele)
    {
    	if(!IsFull(ls))
    	{
    		ls->pData[ls->num++] = ele;	//注意这里
    		return 1;
    	}
    	return 0;
    }
    
    //删除元素,删除编号为 n 的元素,编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
    int ListDelete(List* ls, unsigned int n)
    {
    	if (!IsEmpty(ls))
    	{
    		if (n<1 || n>ls->num)
    		{
    			printf("n输入错误");
    			return 0;
    		}
    
    		for( ;n<ls->num;n++ )
    		{
    			ls->pData[n-1] = ls->pData[n];			
    		}
    		ls->num--;
    		return 1;
    	}
    	return 0;
    }
    
    
    // 取元素编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
    int GetElement(List* ls,unsigned int n, EleType * ele)
    {
    	if(!IsEmpty(ls))
    	{
    		if(n<1 || n>ls->maxlength)
    		{
    			printf("n输入错误");
    			return 0;
    		}
    		*ele = ls->pData[n-1];
    		return 1;
    	}
    	return 0;
    }
    
     //插入元素,在位置 n 插入元素,编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
    int ListInsert(List* ls,unsigned int n, EleType ele)
    {
    	unsigned int i=0;
    	if(!IsFull(ls))
    	{
    		if(n<1 || n>ls->num)
    		{
    			printf("n输入错误");
    			return 0;
    		}
    
    		for(i=ls->num; i>=n;i--)
    		{
    			ls->pData[i] = ls->pData[i-1];			
    		}
    
    		ls->pData[n-1] = ele;
    		ls->num++;
    		return 1;
    	}
    	return 0;
    }
    
    //遍历线性表,遍历线性表,并对元素进行操作,遍历完成返回 -1,否则返回当前元素编号。
    int TraverseList(List* ls, int (*f)(EleType* ))
    {
    	unsigned int i=0;
    	if (!IsEmpty(ls))
    	{
    		for (i=0;i<ls->num;i++)
    		{
    			if(!f(&ls->pData[i]))
    				return i+1;
    		}
    		return 0;
    	}
    	return -1;
    }
    
    
    1. 文件 main.c
    // main.c
    
    
    #include <stdio.h>
    #include "line_list.h"
    
    void ShowList(List*);	//显示线性表
    int PrintElement(EleType* );	//输出元素
    
    int main()
    {
    	int i;
    	EleType ele;
    
    	//创建线性表
    	List* ls = CreateList(100);		
    	if (NULL == ls)
    	{
    		printf("创建线性表失败
    ");
    		return 0;
    	}
    	
    	//测试判空函数
    	i =IsEmpty(ls);		
    	if(i)
    	{
    		printf("线性表为空
    ");
    	}
    
    
    
    	for (i=0;i<100;i++)
    	{
    		ListAppend(ls,i+1);
    	}
    	ShowList(ls);
    
    	//测试判满函数
    	i =IsFull(ls);
    	if(i)
    	{
    		printf("线性表已满
    ");
    	}
    
    	//测试取元素
    	GetElement(ls,3,&ele);
    	printf(" ele = %d
    ",ele);
    
    	//测试插入
    	ListInsert(ls,5,23);
    	ShowList(ls);
    	ListInsert(ls,1,23);
    	ShowList(ls);
    	
    	//测试删除
    	ListDelete(ls,1);
    	ShowList(ls);
    
    	ListDelete(ls,5);
    	ShowList(ls);
        
    	return 1;
    }
    
    
    //显示线性表
    void ShowList(List* ls)
    {
    	TraverseList(ls,PrintElement);
    	printf("
    ");
    }
    
    //输出元素
    int PrintElement(EleType* ele)
    {
    	printf("%d ",*ele);
    	return 1;
    }
    
  • 相关阅读:
    自行车平衡原理
    自行车为什么前轮和后轮受到的摩擦力相反呢 自行车前轮后轮转动方向一样 自行车运动原理
    UltraCompare文件内容比较工具
    msvcp100d.dll文件丢失,解决找不到msvcp100d.dll的问题
    mfc对话框
    bzoj 2298: [HAOI2011]problem a
    9.2python操作redis
    9.1 mysql+centos7+主从复制
    9,Linux下的python3,virtualenv,Mysql、nginx、redis安装配置
    8,Linux系统基础优化及常用命令
  • 原文地址:https://www.cnblogs.com/ay-a/p/9757854.html
Copyright © 2011-2022 走看看