⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my program.txt

📁 串,,,栈,,,链表,,,可以实现多哥数据结构功能
💻 TXT
字号:

 #include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define MAX 8
#define M 5
#define N 7
#define MAXSIZE 20
#define ERROR -1
typedef struct snode
{
 char ch;
 struct snode *next;
}string, *Lstring;
typedef struct node
{
 int data;
 struct node *next;
}Lnode,*LLnode;
typedef struct stack
{
 int data[MAXSIZE];
    int top;
}stack,*Lstack;
typedef struct queuenode
{
 int data;
 struct queuenode *next;
}linkqueue;
typedef struct 
{
 linkqueue *front;
 linkqueue *rear;
}queue;
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void ShowMainMenu();
void ShowListMenu();
void ShowInsertMenu();
void InsertMenu();
void SearchMenu();
void DeleteMenu();
void MyList();
void Insert(Lnode *p);
void Search(Lnode *p);    
void Delete(Lnode *p);   
void ShowListData(Lnode *p);  
void InsertAtHead(Lnode *p);
void InsertAtTail(Lnode *p); 
Lnode *SearchData(Lnode *p);
Lnode *SearchNum(Lnode *p);   
Lnode *DeleteData(Lnode *p);
Lnode *DeleteNum(Lnode *p); 
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void MyString();
string *assign(string *p,int n);/*建立第一个单链表*/
string *assignp(string *p,int n);/*建立第二个单链表*/
string *assignpp(string *p,int n);/*建立第三个单链表*/
void print(string *p);/*打印单链表*/
void length(string *p);/*求表长*/
void catchstr(string *p,string *tp);/*连接两个链表*/
void Insertstr(string *tp,string *p);/*把p插入到tp中*/
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/ 
void MyStack();
void Initstack(stack **s);/*初始化堆栈*/
bool Isempty(stack s);/*判断栈空*/
bool Isfull(stack s);/*判断栈满*/
void Push(stack *s,int x);/*压栈*/
int Pop(stack *s);/*出栈*/
int Gettop(stack s);/*获取栈顶元素*/
void Emptystack(stack *s);/*置栈为空*/
int Measurestack(stack s);/*求栈长*/
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/ 
void main()
{
 int n;
 do{
  ShowMainMenu();
  printf("请输入选择序号1-4:\n");
  scanf("%d",&n);
  switch(n)
  {
   case 1:
    MyList();
       break;
            case 2:
                MyString();
                break;
   case 3:
    MyStack();
    break;
   case 4:
    break;
   default:
    printf("错误,重新输入\n");
  }
 }while(n!=4);
}
void MyList()
{
 Lnode *head;
 int n,i,b[10]={1,2,3,4,5,6,7,8,9,10}; 
 head=(Lnode *)malloc(sizeof(Lnode));
 head->next=NULL;
 Lnode *q,*p=head;
 for(i=0;i<10;i++)
 {
  q=(Lnode*)malloc(sizeof(Lnode));
        q->data=b[i];
     q->next=NULL;
  p->next=q;  
  p=p->next;
 }
 do{
  ShowListMenu();
  printf("请输入选择序号1-6:\n");
  scanf("%d",&n);
  switch(n)
  {
   case 1:
    {
     if(head)
      printf("创建了一个带头结点的链表\n");
     else
      printf("创建链表操作失败\n");
     ShowListData(head);
    }
    break;
   case 2:
    Insert(head);
    break;
   case 3:
    Search(head);
    break;
   case 4:
    Delete(head);
    break;
   case 5:
    ShowListData(head);
    break;
   case 6:
    break;
   default:
    printf("错误,重新输入\n");
  }
 }while(n!=6);
}
void Insert(Lnode *hp)
{
 if(hp==NULL)
 {
  printf("链表没有创建,不能进行此项操作\n");
  return;
 }
 int n;
 do{
  InsertMenu();
  printf("请输入选择序号1-3:\n");
  scanf("%d",&n);
  switch(n){
   case 1:
    InsertAtHead(hp);
    break;
   case 2:
    InsertAtTail(hp);
    break;
   case 3:
    break;
   default:
    printf("错误,重新输入\n");
  }
 }while(n!=3);
}
void Search(Lnode *hp)
{
 Lnode *p;
 if(hp==NULL)
 {
  printf("链表没有创建,不能进行此项操作\n");
  return;
 }
 int n;
 do{
  SearchMenu();
  printf("请输入选择序号1-3:\n");
  scanf("%d",&n);
  switch(n){
   case 1:
    p=SearchData(hp);
    break;
   case 2:
    p=SearchNum(hp);
    break;
   case 3:
    break;
   default:
    printf("错误,重新输入\n");
  }
 }while(n!=3);
}
void Delete(Lnode *hp)
{
 Lnode *p;
 if(hp==NULL)
 {
  printf("链表没有创建,不能进行此项操作\n");
  return;
 }
 int n;
 do{
  DeleteMenu();
  printf("请输入选择序号1-3:\n");
  scanf("%d",&n);
  switch(n){
   case 1:
    p=DeleteData(hp);
    break;
   case 2:
    p=DeleteNum(hp);
    break;
   case 3:
    break;
   default:
    printf("错误,重新输入\n");
  }
 }while(n!=3);
}
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void ShowMainMenu()
{
 printf("\n **************《数据结构课程设计》****************\n");
 printf("         *  1 线性表             2 串    *\n"  );
 printf("         *  3 栈                 4 退出  *\n"  );
 printf("  ***************************************************\n");
}
void ShowListMenu()
{
 printf("  ************《线性表》*************\n");
 printf("  *  1 创建线性表  2 插入元素       *\n");
 printf("  *  3 查找元素    4 删除元素       *\n");
 printf("  *  5 浏览        6 退出           *\n");
 printf("  ***********************************\n");
}
void InsertMenu()
{
 printf("  **********《线性表插入元素》*******\n");
 printf("  *  1 头插    2 尾插    3 退出     *\n");
 printf("  ***********************************\n");
}
void SearchMenu()
{
 printf("  **********《线性表查找元素》*******\n");
 printf("  * 1 按值查找 2 按序号查找 3 退出  *\n");
 printf("  ***********************************\n");
}
void DeleteMenu()
{
 printf("  ************《线性表删除元素》***********\n");
 printf("  * 1 删除特定元素 2 删除第i个元素 3 退出 *\n");
 printf("  *****************************************\n");
}
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void ShowStringMenu()
{
 printf("  *****************《串》****************\n");
 printf("  *  1 创建两个串链表  2 求表长         *\n");
 printf("  *  3 连接两个串链表  4 插入           *\n");
 printf("  *  5 浏览            6 退出           *\n");
 printf("  ***************************************\n");
}
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void ShowStackMenu()
{
 printf("  ******************《堆栈》**************\n");
 printf("  *   1  初始化堆栈       2 判断栈空     *\n");
 printf("  *   3  判断栈满         4 压栈         *\n");
 printf("  *   5  求栈长           6 获取栈顶元素 *\n");
    printf("  *   7  出栈             8  退出        *\n");
 printf("  ****************************************\n");
}
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void InsertAtTail(Lnode *h)
{
 Lnode *p=h;
 int x;
 printf("请输入要插入的元素:");
 scanf("%d",&x);
    while(p->next)
  p=p->next;
 p->next=(Lnode*)malloc(sizeof(Lnode));
 p->next->data=x;
 p->next->next=NULL;  
 ShowListData(h);
}
void InsertAtHead(Lnode *h)
{
 Lnode *p=h,*q;
    int x;
 printf("请输入要插入的元素:");
 scanf("%d",&x);
 q=(Lnode*)malloc(sizeof(Lnode));
 q->data=x;
    q->next=p->next;
 p->next=q;
    ShowListData(h);
}
Lnode *SearchNum(Lnode *h)
{
 int i;
 printf("请输入要查找的结点元素的序号:");
 scanf("%d",&i);
 LLnode p=h;
    int j=0;
    while(p->next&&j<i)
 {
  j++;
        p=p->next;
 }
 if(j==i)
 {
  printf("查找到的结点为:%d\n",p->data);
     return p;
 }
    else 
 {
  printf("未找到目标结点\n");
  return h;
 }
}
Lnode *SearchData(Lnode *h)
{
    int x;
 printf("请输入要查找的结点元素:");
 scanf("%d",&x);
 LLnode p=h->next;
    while(p&&p->data!=x)
  p=p->next;
    if(p&&p->data==x)
 {
  printf("查找到的结点为:%d\n",p->data);
        return p;
 }
    else 
 {
  printf("未找到目标结点\n");
  return h;
 }
}
Lnode *DeleteNum(Lnode *h)
{
    int i;
 printf("请输入要删除的结点元素的序号:");
 scanf("%d",&i);
 LLnode q,p=h;
    int j=0;
 while(p->next&&j<i)
 {
  j++;
        p=p->next;
 }
    if(p->next&&j==i)
 {
  q=p->next;
  p->next=q->next;
  printf("目标结点已删除\n");
  return q;
  free(q);
 }
    else
 {
  printf("未找到目标结点\n");
  return h;
 }
}
Lnode *DeleteData(Lnode *h)
{
    int x;
 printf("请输入要删除的结点元素:");
 scanf("%d",&x);
 Lnode *q,*p=h;
    while(p->next&&p->next->data!=x)
  p=p->next;
    q=p->next;
 if(q&&q->data==x)
 {
  printf("目标结点已删除\n");
  p->next=q->next;
     return q;
  free(q);
 }
    else 
 {
  printf("未找到目标结点\n");
  return h;
 }
}
void ShowListData(Lnode *p)
{
 Lnode *q=p->next;
 while(q)
 {
  printf("%d,",q->data);
  q=q->next;
 }
 printf("\n");
}  
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void MyString()
{
 Lstring head,phead,thead; 
 int n;
 head=(string *)malloc(sizeof(string));
 head->next=NULL;
    phead=(string *)malloc(sizeof(string));
 phead->next=NULL;
 thead=(string *)malloc(sizeof(string));
 thead->next=NULL;
 if(head&&phead)
  printf("初始化成功\n");
 else
  printf("初始化失败\n");
 do{
  ShowStringMenu();
  printf("请输入选择序号1-6:\n");
  scanf("%d",&n);
  switch(n)
  {
   case 1:
    {
     head=assign(head,M);
                 phead=assignp(phead,N);
     thead=assignpp(thead,N);
     printf("第一个链表为:");
                    print(head);
     printf("\n");
                    printf("第二个链表为:");
        print(phead);
     printf("\n");
     printf("第三个链表为:");
        print(thead);
     printf("\n");
    }
    break;
   case 2:
                length(head);
    break;
   case 3:
                catchstr(head,phead);
    break;
   case 4:
    Insertstr(head,thead);
    break;
   case 5:
    print(head);
    break;
   case 6:
    break;
   default:
    printf("错误,重新输入\n");
  }
 }while(n!=6);
}
string *assign(string *p,int n)
{
 string *q=p,*pp;
 int i;
 char a[]={'L','o','v','e','\0'};
    for(i=0;i<n;i++)
  {
   pp=(string*)malloc(sizeof(string));
      pp->ch=a[i];
       pp->next=NULL;
      q->next=pp;
      q=q->next;
  };
 return p;
}
string *assignp(string *p,int n)
{
 string *q=p,*pp;
 int j;
 char b[]={"father"};
    for(j=0;j<n;j++)
  {
   pp=(string*)malloc(sizeof(string));
      pp->ch=b[j];
      pp->next=NULL;
         q->next=pp;
      q=q->next;
  }
 return p;
}
string *assignpp(string *p,int n)
{
 string *q=p,*pp;
 int j;
 char b[]={"mother"};
    for(j=0;j<n;j++)
  {
   pp=(string*)malloc(sizeof(string));
      pp->ch=b[j];
      pp->next=NULL;
         q->next=pp;
      q=q->next;
  }
 return p;
}       
void print(string *p)
{
 string *q=p->next;
 while(q)
 {
  printf("%c",q->ch);
  q=q->next;
 }
 printf("\n");
}
void length(string *p)
{
 string *q=p->next;
 int i=0;
    while(q)
 {
  i++;
  q=q->next;
 }
 printf("表长为:%d\n",i);
}
void catchstr(string *p,string *tp)
{
 string *q=p;
 while(q->next)
  q=q->next;
 q->next=tp->next;
 free(tp);
 print(p);
}
void Insertstr(string *tp,string *p)
{
 string *q=tp,*qq,*pq=p;
 int i,j=0;
 printf("把p插入到tp中的第i个位置");
 scanf("%d",&i);
 while(q->next&&j<i)
 {
  q=q->next;
  j++;
 }
 qq=q->next;
 while(pq->next)
  pq=pq->next;
 if(qq&&j==i)
 {
  q->next=p->next;
  pq->next=qq;
  free(p);
  printf("\n^^^^^^插入成功^^^^^^^\n");
 }
 else
  printf("位置越界\n");
}
/*★&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&★*/
void MyStack()
{
 Lstack p;
 int q,i,n;
 
 do{
  ShowStackMenu();
  printf("请输入选择序号1-6:\n");
  scanf("%d",&n);
  switch(n)
  {
   case 1:
    {
     Initstack(&p);
  printf("初始化成功");
     printf("\n");
    }
    break;
   case 2:
    if(Isempty(*p))
     printf("栈空\n");
    else printf("栈非空\n");
    break;
   case 3:
    if(Isfull(*p))
     printf("栈满\n");
    else printf("栈非满\n");
    break;
   case 4:
    printf("请输入4个数字:\n");
    for(i=0;i<4;i++)
    {
     scanf("%d",&q);
     Push(p,q);
    }
    break;
   case 5:
    printf("栈长为:");
    printf("%d\n",Measurestack(*p));
    break;
   case 6:
    printf("获取栈顶元素:");
    printf("%d\n",Gettop(*p));
    break;
   case 7:
    printf("出栈:");
    for(i=0;i<4;i++)
     printf("%d,",Pop(p));
    printf("\n");
    break;
   case 8:
    break;
   default:
    printf("错误,重新输入\n");
  }
 }while(n!=8);
}
/*另一种初始化方式:
stack *Initstack(stack *s)
{
 s=(stack*)malloc(sizeof(stack));
    s->top=0;
    return s;
}*/
void Initstack(stack **s)
{
 (*s)=(stack*)malloc(sizeof(stack));
    (*s)->top=0;
}
bool Isempty(stack s)
{
 if(s.top==0)
  return true;
    else return false;
}
bool Isfull(stack s)
{
 if(s.top==MAXSIZE)
  return true;
    else return false;
}
void Push(stack *s,int x)
{
 if(!Isfull(*s))
 { 
  
        s->data[s->top]=x;
        s->top++;
 }
    else printf("栈上溢");
}
int Pop(stack *s)
{
 if(!Isempty(*s))
 {
  s->top--;
        return s->data[s->top];
 }
    else
 {
  printf("栈下溢");
  return ERROR;
 }
}
int Gettop(stack s)
{
 if(!Isempty(s))
  return s.data[s.top-1];
    else
 {
  printf("栈空");
  return ERROR;
 }
}
int Measurestack(stack s)
{
 return s.top;
}
 
 
 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -