鱼C论坛

 找回密码
 立即注册
查看: 2654|回复: 0

[学习笔记] 线性表及其操作

[复制链接]
发表于 2021-10-17 21:05:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#define Muxnum 100;
//定义顺序表
typedef int DataType;
typedef struct Seqlist
{
    int MAXNUM;
    int n;
    DataType *element;
}*PSeqlist;
PSeqlist palist;
//定义单链表
typedef struct Node
{
    DataType info;
    struct Node*link;

}*LinkList;
LinkList llist;
//创建空的顺序表
void createNullList_seq(int m)
{
    palist=(PSeqlist)malloc(sizeof(struct Seqlist));
    if(palist!=NULL)
    {
        palist->element =(DataType*)malloc(sizeof(DataType)*m);
        if(palist->element)
            {
            palist->MAXNUM=m;
            palist->n=0;
            printf("创建成功\n");
            }
        else free(palist);
    }
    else printf("Out of space!!!");
}
//判断顺序表是否为空
int isNUllList_seq()
{
    if(palist ->n==0)
        return 1;
    else
        return 0;
}

//查找
int locate_seq(DataType x)
{
    int q;
    for(q=0;q<palist->n;q++)
    if(palist -> element[q]==x)return q;
    return -1;
}
//前插
int insertPre_seq(int p,DataType x)
{
    int q;
    if(palist->n>=palist->MAXNUM)
    {
        printf("溢出\n");
        return 0;
    }
    if(p<0||p>palist->n)
    {
        printf("不存在下标p\n");
        return 0;
    }
    for(q=palist->n-1;q>=p;q--)
        palist->element[q+1]=palist->element[q];
     printf("%d",x);
    palist->element[p]=x;
    printf("%d",palist->element[p]);
    palist->n=palist->n+1;
    return 1;
}
//后插

int insertPost_seq(int p,DataType x)
{
    int q;
    if(palist->n>=palist->MAXNUM)
    {
        printf("溢出\n");
        return 0;
    }
    if(p<0||p>palist->n)
    {
        printf("不存在下标p\n");
        return 0;
    }
    for(q=palist->n-1;q>p;q--)
        palist->element[q+1]=palist->element[q];
     printf("%d",x);
    palist->element[p]=x;
    printf("%d",palist->element[p]);
    palist->n=palist->n+1;
    return 1;
}
//按位删除
DataType deleteP_seq(int p)
{
    int q;
    DataType temp;
    if(isNUllList_seq())
    {
    printf("此顺序表为空\n");
    }
    if(p<0||p>palist->n-1)
    {printf("%d",palist->element[q]);
        printf("不存在下标为p的元素\n");
        return 0;
    }
    temp=palist->element[p];
    for(q=p;q<palist->n-1;q++)

        palist->element[p]=palist->element[q+1];

    palist->n=palist->n-1;
    return temp;
}
//按值删除
DataType deleteV_seq(DataType x)
{
    int p;
    p=locate_seq(x);
    deleteP_seq(p);
}
//遍历顺序表
void print_seq()
{
    int i;
    printf("The list is:");
    for(i=0;i<palist->n;i++)
    {
        printf("%d\t",palist->element[i]);
    }
}


//创建单链表
void creatNullList_link(void)
{
    llist=(LinkList)malloc(sizeof(struct Node));
    if(llist!=NULL)llist->link=NULL;
        else printf("out of space!\n");
}
//判断单链表是否为空
int isNullList_link()
{
    if(llist->link==0)
    return 1;
    else
        return 0;

}
//查找
struct Node * locate_link(DataType x)
{
    struct Node *p;
    if(llist==NULL)
    {
        return NULL;
    }
    p=llist->link;
    while(p!=NULL && p->info!=x)
    {
    p=p->link;
    }
    return p;
}
//尾插
 insertPost_link()
{
    DataType x;
    llist=(struct Node*)malloc(sizeof(struct Node));
    struct Node*p;
    struct Node*q;
    q=llist;
    printf("请输入你想插入的数字以0为结束:");
    scanf("%d",&x);
    while(x!=0)
    {
        p=(struct Node*)malloc(sizeof(struct Node));
        p->info=x;
        q->link=p;
        q=p;
        scanf("%d",&x);
    }
    q->link=NULL;

}

//按值删除
int deletneV_link(DataType x)
{
    struct Node *p,*q;
    p=llist;
    if(p==NULL)return 0;
    while(p->link!=NULL && p->link->info!=x)
    {
        p=p->link;
    }
    if(p->link==NULL)
    {
        printf("Not exit!\n");
        return 0;
    }
    else{
        q=p->link;
        p->link=q->link;
        free(q);
        return 1;
    }
}
//打印
void print_link()
{
    struct Node *p=llist->link;
    isNullList_link();
    while(p!=NULL)
    {
        printf("%d",p->info);
        p=p->link;
    }
    printf("\n");
}
menu_link()
{
    int myc;
    int b,n,d;
    struct Node*a1;
    struct Node*c1;
    DataType g,a2,b2;
    creatNullList_link();
    isNullList_link();
    while(1)
    {
    printf("-----1.打印-----\n");
    printf("-----2.按值删除-----\n");
    printf("-----3.后插-----\n");
    printf("-----4.查找-----\n");
    printf("please input your choose:\n");
    scanf("%d",&myc);
    switch(myc)
    {
        case 1:print_link();
              break;
        case 2:printf("请输入你想要删除的数值:");
               scanf("%d",&b);
               b2=deletneV_link( b);
               printf("\n");
               print_link();
               break;
        case 3:{
                   a1=insertPost_link();
                   print_link();
                   }//尾插


               break;
        case 4:{printf("请输入你想查找的数值:");
               scanf("%d",&g);
               c1=locate_link(g);
               if(NULL==c1) printf("未找到\n");
               else printf("找到了\n");
               break;}
        case 0:exit(0);
        default:printf("wrong!");
        }

    }
}
void menu_seq()
{
    int myc;
    int a,b,c,d,e,f,g,m,n;
    int a1,b1,c1;
    DataType a2,b2;
    printf("请输入顺序表的大小:");
    scanf("%d",&m);
    createNullList_seq(m);
    isNUllList_seq();
    while(1)
    {
    printf("-----1.打印-----\n");
    printf("-----2.按位删除-----\n");
    printf("-----3.按值删除-----\n");
    printf("-----4.前插-----\n");
    printf("-----5.后插-----\n");
    printf("-----6.查找-----\n");
    printf("please input your choose:\n");
    scanf("%d",&myc);
    switch(myc)
    {
        case 1:print_seq();
              break;
        case 2:{printf("请输入你想删除的位置:");
               scanf("%d",&a);
               a2=deleteP_seq(a);
               if(a2==0)
                 printf("成功\n");
               else printf("不成功\n");
               print_seq();
               printf("\n");}
               break;
        case 3:{printf("请输入你想要删除的数值:");
               scanf("%d",&b);
               b2=deleteV_seq( b);
               if(b2==0)
                 printf("成功\n");
               else printf("不成功\n");
               print_seq();
               printf("\n");}
               break;
        case 4:{printf("请输入你想要插入的位置:");
               scanf("%d",&c);
               printf("请输入你想插入的数字:");
               scanf("%d",&d);
               a1=insertPre_seq(c,d);//前插
               if(a1==1)
                 printf("成功\n");
               else printf("不成功\n");
               print_seq();
               printf("\n");}
               break;
        case 5:{printf("请输入你想要插入的位置:");
               scanf("%d",&e);
               printf("请输入你想插入的数字:");
               scanf("%d",&f);
              b1=insertPost_seq(e,f);//后插
              if(b1==1)
                 printf("成功\n");
               else printf("不成功\n");
              print_seq();
              printf("\n");}
              break;
        case 6:{printf("请输入你想查找的数值:");
               scanf("%d",&g);
               c1=locate_seq(g);
               printf("%d\n",c1);
               }
               break;
        case 0:exit(0);
        default:printf("wrong!");
        }

    }
}

void menu_list()
{
    int myc;
    while(1)
    {
        printf("\n-------menu_main-------");
        printf("\n-----1.顺序表-----");
        printf("\n-----2.单链表-----");
        printf("\n-----0.exit-------");
        printf("\nplease choose one sort:");
        scanf("%d",&myc);
        switch(myc)
        {
            case 1:menu_seq();

                   break;
            case 2:menu_link();

                   break;
            case 0:exit(0);
            default:printf("wrong!");
        }
    }
}
int main()
{
    menu_list();
    return 0;
}
今天刚刚敲完所有线性表的操作第一次自己在没老师指导的情况下完成,虽然不完美但很有成就感,放出来大家交流交流
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表