QAQ学习鸭 发表于 2021-10-17 21:05:53

线性表及其操作

#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==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=palist->element;
   printf("%d",x);
    palist->element=x;
    printf("%d",palist->element);
    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=palist->element;
   printf("%d",x);
    palist->element=x;
    printf("%d",palist->element);
    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);
      printf("不存在下标为p的元素\n");
      return 0;
    }
    temp=palist->element;
    for(q=p;q<palist->n-1;q++)

      palist->element=palist->element;

    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);
    }
}


//创建单链表
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;
}
今天刚刚敲完所有线性表的操作第一次自己在没老师指导的情况下完成,虽然不完美但很有成就感,放出来大家交流交流{:10_297:}
页: [1]
查看完整版本: 线性表及其操作