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

📄 danlianbiaocaozuo.txt

📁 数据结构课程设计 单链表的操作
💻 TXT
字号:
#include <malloc.h> 
#include<stdlib.h> 
#include <stdio.h> 
typedef struct Lnode
{int data; 
struct Lnode *next; 
}*Linklist,Lnode;       
void CreatList(Lnode *L)   /*建立链表函数*/
{ Lnode *p;
  int value;
  L->next=NULL;
 while (1)  /*当输入非0数值时*/
  {scanf( "%d",&value); 
  if (value==NULL)
   return; 
   p=(Lnode *)malloc(sizeof(Lnode));  /*建立P链表*/
   p->data=value;
   p->next=L->next;   /*把后输入的插到前面*/
   L->next=p;
 }
}
void paixu(Lnode *L)
{
 Linklist r,q,small;int temp; 
 for(r=L->next;r->next!=NULL;r=r->next) 
 {small=r; 
  for(q=r->next;q;q=q->next) /*找到链表中最小元素*/
     if(q->data<small->data) 
        small=q; 
  if(small!=r) 
  {temp=r->data; 
  r->data=small->data;        /*把最小的数值换到P指针所指的位置数值上(原P指针的next指向不变)*/
  small->data=temp;           /*把原先p指针所指位置的数值填入被置换出的最小元素位置*/
  } 
 } 
 printf("正在对新链表进行排序……\n"); 
} 
void PrintList(Lnode *L) /*打印链表函数*/
{ 
 Lnode *p=L->next;     /*带头节点,把指针置于第一个数*/
 if(p==0)
 {printf("链表为空");}
 else
 printf("链表为:");
 {while(p)
 {
 printf("%d>>", p->data);
 p=p->next;
 }
 } 
 printf("\n");
}  
inter(Lnode *L,int i)
{
 Lnode *k=L->next;
 while(k)
 {if (k->data==i)
    return 1;
  k=k->next;
 }
 return 0;
}
int ListInsert_L(Lnode *L, int i, int e)
{
 Lnode *p=L->next;
 Lnode *s;
 int j=0;
 while (p && j<i-1) {p=p->next; ++j;}
 if (!p || j>i-1) return 0; 
 s=(Lnode *)malloc(sizeof(Lnode));
 s->data=e;
 s->next=p->next;
 p->next=s;
 return 1;
}
int ListDelete_L(Lnode *L,int i)
{
 Lnode *p=L->next;
 int j=0;
 Lnode *q;
 while (p->next && j<i-1) {p=p->next; ++j;} /*找出第i节点,并令p指向其前趋*/
 if (!p->next || j>i-1) return 0; 
 q=p->next;
 p->next=q->next;
 free(q);
 return 1;
}
main()
{
 int sign,sign1,signa,signb,signc,i,x,ca,cb,cc;
 int choice=1;
 Lnode *A,*B,*C,*D,*E,*L,*p,*q,*n,*m;
 A=(Lnode *)malloc(sizeof(Lnode));
 B=(Lnode *)malloc(sizeof(Lnode));
 C=(Lnode *)malloc(sizeof(Lnode));
 D=(Lnode *)malloc(sizeof(Lnode));
 E=(Lnode *)malloc(sizeof(Lnode));
 printf("\t 《潇的数据结构课程设计——单链表的级别操作》\n\n");
 while (choice)
 {
  printf("\t 请选择您想进行的操作(按任意键退出程序):\n 1:对A链表操作 \n 2:对B链表操作 \n 3:两链表运算 \n \n 您的选择是:");
  scanf("%d",&sign1);
   if (sign1==1)
    {L=A;
     ca=1;
    while (ca)
      {printf("\t 请选择对A链表进行的操作:\n 1:建立链表 \n 2:对链表排序 \n 3:在链表中插入元素 \n 4:在链表中删除元素 \n 5:返回上一级菜单 \n 您的选择是:");
    scanf("%d",&signa);
             switch(signa)
              {
            case 1:
             printf("\n请输入链表元素(输入0结束)\n");
             CreatList(A);
             PrintList(A);
       break;
            case 2:
       printf("对A链表进行排序,结果为:\n ");
             paixu(A);
                      PrintList(A);
       break;
      case 3:
             printf("请输入想要插入的位置及插入的数值(以逗号分隔): ");
             scanf("%d,%d",&i,&x);
             if (ListInsert_L(L,i,x)==1)
            {printf("修改成功!目前A链表为:\n");
                PrintList(L);}
                      else 
               printf("警告!您输入的插入位置超过链表长度。 \n");
        break;
        case 4:
            printf("请输入想要删除的元素位置: ");
             scanf("%d",&i);
             if (ListDelete_L(L,i)==1)
            {printf("删除元素成功!目前A链表为:\n");
                PrintList(L);}
                      else 
               printf("警告!您输入的删除位置超过链表长度。 \n");
        break;
        case 5: 
             ca=0;
             break;
        default: 
        printf("警告!只能选择1-5。 \n");
        break;
       }
        }
       }
   else if (sign1==2) 
    {L=B;
     cb=1;
    while (cb)
      {printf("\t 请选择对B链表进行的操作:\n 1:建立链表 \n 2:对链表排序 \n 3:在链表中插入元素 \n 4:在链表中删除元素 \n 5:返回上一级菜单 \n 您的选择是:");
    scanf("%d",&signb);
             switch(signb)
              {
            case 1:
             printf("\n请输入链表元素(输入0结束)\n");
             CreatList(B);
             PrintList(B);
       break;
            case 2:
       printf("对B链表进行排序,结果为:\n ");
             paixu(B);
                      PrintList(B);
       break;
      case 3:
             printf("请输入想要插入的位置及插入的数值(以逗号分隔): ");
             scanf("%d,%d",&i,&x);
             if (ListInsert_L(L,i,x)==1)
            {printf("修改成功!目前B链表为:\n");
                PrintList(L);}
                      else 
               printf("警告!您输入的插入位置超过链表长度。 \n");
        break;
        case 4:
            printf("请输入想要删除的元素位置: ");
             scanf("%d",&i);
             if (ListDelete_L(L,i)==1)
            {printf("删除元素成功!目前B链表为:\n");
                PrintList(L);}
                      else 
               printf("警告!您输入的删除位置超过链表长度。 \n");
        break;
        case 5: 
             cb=0;
             break;
        default: 
        printf("警告!只能选择1-5。 \n");
        break;
       }
        }
    }
    
   else if (sign1==3) 
    {cc=1;
        while (cc)
         {printf("\t 请选择操作的名称:\n 1:显示当前的A、B链表 \n 2:进行差运算 \n 3:进行交运算 \n 4:进行并运算 \n 5:返回上一级菜单 \n 您的选择是:");
       scanf("%d",&signc);
                switch(signc)
                 {
               case 1:
                   printf(" \n 当前A");
                   PrintList(A);
                   printf(" \n 当前B");
                   PrintList(B);
                   break;
               case 2:
             p=B->next;
                       while(p)
                        {if (!inter(A,p->data))
                         {m=(Lnode *)malloc(sizeof(Lnode));
                          m->data=p->data;
                          m->next=C->next;
                          C->next=m;
                         }
                         p=p->next;
                        }
                       printf(" \n 进行差运算,结果为:\n");
                       PrintList(C);
              C=(Lnode *)malloc(sizeof(Lnode)); /*必须再分配一次地址空间以用来把原链表清空,否则每次运行都会使链表元素增加*/
              break;
                     case 3:
                p=B->next;
                       while(p)
                        {if (inter(A,p->data))
                         {q=(Lnode *)malloc(sizeof(Lnode));
                          q->data=p->data;
                          q->next=D->next;
                          D->next=q;
                         }
                         p=p->next;
                        }
                       printf(" \n 进行交运算,结果为:\n");
                       PrintList(D);
                       D=(Lnode *)malloc(sizeof(Lnode));
                       break;
               case 4:
                *E=*A;
                         p=B->next;
                       while(p)
                        {if (!inter(E,p->data))
                         {n=(Lnode *)malloc(sizeof(Lnode));
                          n->data=p->data;
                          n->next=E->next;
                          E->next=n;
                         }
                         p=p->next;
                        }
                       printf(" \n 进行并运算,结果为:\n");
                       PrintList(E);
                       E=(Lnode *)malloc(sizeof(Lnode));
                       break;  
            case 5:
                cc=0;
                break;
            default: 
             printf("警告!只能选择1-5。 \n");
             break;
                 }
         }
        }
   else 
   {
    printf("谢谢使用,请按任意键退出!\n");
    break;
   }
      } 
 
 return 0;
} 

⌨️ 快捷键说明

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