zoukankan      html  css  js  c++  java
  • 顺序表

    /******main.c******/

    #include <stdio.h>

    #include <stdlib.h>
    #include "Sqlist.h"
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */


    int main(int argc, char *argv[]) {
    Sqlist L;
    Student e,pre_e,Next_e;
    int key=-1;
    int num,i;
    char num2[20];
    /*
    张光祥  201603041032 
    */ 
    printf("1.初始化 默认  ");
    printf("2.查找  ");
    printf("3.插入  ");
    printf("4.删除  ");
    printf("5.销毁  ");
    printf("6.清空  ");
    printf("7.长度  ");
    printf("8.是否为空  ");
    printf("9.第一个与e相等的值的位置  ");
    printf("10.前驱  ");
    printf("11.后继  ");
    printf("12.输出线性表  ");
    printf("13.结束 ");
    InitList(&L);

    for(int i=1;i<=2;i++){
    ListInsert_Sq(&L, i, myscanf());

    while(key){
    printf("你将要: ");
    scanf("%d",&num); 
    switch(num){
    case 1:
    InitList(&L);
    break;
    case 2:
    printf("你想找第几个 ");
    scanf("%d",&i); 
    Getelem(L,i,&e);
    printf("第%d个是",i);
    myprintf(e);
    printf(" ");
    break;
    case 3:
    printf("插入位置是? ");
    scanf("%d",&i);
    printf("插入值为 ");
    ListInsert_Sq(&L, i, myscanf());
    break;
    case 4:
    printf("你想删除第几个 ");
    scanf("%d",&i); 
    ListDelete_Sq(&L,i);
    break;
    case 5:
    while(1){
    printf("确定要销毁该线性表1.是  2.否 ");
    scanf("%d",&i);
    if(i==1){
    DestroyList(&L);
    key=0;//bug,目前不懂为什么free了空间还可以插入,所以直接结束程序,有明白的请指教 
    break;
    }else if(i==2){
    break;
    }else{
    printf("输入有误 "); 
    }
    }
    break;
    case 6:
    while(1){
    printf("确定要清空该线性表1.是  2.否 ");
    scanf("%d",&i);
    if(i==1){
    ClearList(&L);
    break;
    }else if(i==2){
    break;
    }else{
    printf("输入有误 "); 
    }
    }
    break;
    case 7:
    printf("线性表的长度是%d ",GetLength(L)) ;
    break;
    case 8:
    if(ListEmpty(L)){
    printf("线性表为空 ");
    }else{
    printf("线性表不为空 ");
    }
    break;
    case 9:
    printf("你想要查找的姓名为 ");
    scanf("%s",&num2);
    if(LocateElem(L,num2)){
    printf("%s位于第%d个位置 ",num2,LocateElem(L,num2)) ;
    }else{
    printf("不存在该值 ");
    }

    break;
    case 10:
    printf("你想查找谁(姓名)的前驱 ");
    scanf("%s",&num2);
    printf("%s",num2); 
    if(LocateElem(L,num2)){
    PriorElem(L,num2,&pre_e);
    printf("学号%s的前驱为 ",num2);
    myprintf(pre_e);
    printf(" "); 
    }else{
    printf("不存在该值 ");
    }
    break;
    case 11:
    printf("你想要查找谁(姓名)的后继 ");
    scanf("%s",&num2);
    if(LocateElem(L,num2)){
    NextElem(L,num2,&Next_e);
    printf("学号%s的后继为 ",num2);
    myprintf(Next_e);
    printf(" ");
    }else{
    printf("不存在该值 ");
    }
    break;
    case 12:
    TraverseList(L);
    break;
    case 13:
    key=0;
    break;
    default: printf("输入有误 ");break;

    }
    return 0;

    }

    /**********Sqlist.h**********/

    #include <string.h>
    #define MAXSIZE 100
    /*
    张光祥  201603041032 
    */ 
    /*
    学生结构体 
    */
    typedef  struct{
    char no[20];
    char name[30];
    int result;
    }Student;
    /*
    格式化输入结构体
    */
    Student myscanf(){
    Student stu;
    scanf("%s%s%d",&stu.no,&stu.name,&stu.result);
    return stu;

    /*
    格式化输出结构体 
    */
    void myprintf(Student e){
    printf("学号:%s  姓名:%s  成绩:%d",e.no,e.name,e.result);





    /*
    构建顺序表 
    */ 
    typedef struct{
    Student *elem;
    int length;
    }Sqlist; 
    /*
    顺序表的初始化 
    */
    int InitList(Sqlist *L){
    L->elem=(Student *)malloc(sizeof(Student)*MAXSIZE);
    if(!L->elem) exit(0);
    L->length=0;
    return 1;

    /*
    顺序表的查找 
    */ 
    int Getelem(Sqlist L,int i,Student *e){
    if(i<1||i>L.length) return 0;
    *e=L.elem[i-1];
    return 1;

    /*
    顺序表的插入 
    */ 
    int ListInsert_Sq(Sqlist *L, int i, Student e){
    if(i<1||i>L->length+1) return 0;
    if(L->length==MAXSIZE) return 0; 
    for(int j=L->length;j>=i;j--){
    L->elem[j]=L->elem[j-1];
    }
    L->elem[i-1]=e;
    L->length++;
    return 1;
    }
    /*
    顺序表的删除 
    */
    int ListDelete_Sq(Sqlist *L,int i){
    if(i<1||i>L->length) return 0;
    for(int j=i-1;j<L->length-1;j++){
    L->elem[j]=L->elem[j+1];
    }
    L->length--;
    return 1;

    /*
    销毁线性表 
    */
    void DestroyList(Sqlist *L){
    if(L->elem)  free(L->elem);

    /*
    清空线性表 
    */
    void ClearList(Sqlist *L){
    L->length=0;

    /*
    求线性表的长度 
    */
    int GetLength(Sqlist L){
    return L.length;
    }
    /*
    判断线性表是否为空 
    */ 
    int ListEmpty(Sqlist L){
    if(L.length==0){
    return 1;
    }else return 0;
    }
    /*
    第一个与e相等的值的位置 
    */
    int LocateElem(Sqlist L,char No[]){
    for(int i=0;i<L.length;i++){
    if(strcmp(L.elem[i].name,No)==0) return i+1;
    }
    return 0;

    /*
    返回线性表元素的前驱 
    */
    int PriorElem(Sqlist L,char cur_e[],Student *pre_e){
    if(LocateElem(L,cur_e)>1){
    *pre_e=L.elem[LocateElem(L,cur_e)-2];
    }else return 0;

    /*
    返回线性表元素的后继 
    */
    int NextElem(Sqlist L,char cur_e[],Student *Next_e){
    if(LocateElem(L,cur_e)>=1&&LocateElem(L,cur_e)<L.length){
    *Next_e=L.elem[LocateElem(L,cur_e)];
    }else return 0;

    /*
    遍历输出线性表 
    */ 
    int TraverseList(Sqlist L){
    for(int i=0;i<L.length;i++){
    myprintf(L.elem[i]);
    printf(" ");
    }

  • 相关阅读:
    源码安装php7.2
    Docker虚拟化之<基础命令>
    Docker虚拟化之<基础理论>
    旧版Linux系统下载地址
    Linux磁盘分区,挂载
    linux crond任务调度
    Linux学习之组管理和权限管理
    mysql 外键的基本使用
    Linux指令(压缩和解压类)
    Linux指令(搜索查找类)
  • 原文地址:https://www.cnblogs.com/zhangguangxiang/p/14232665.html
Copyright © 2011-2022 走看看