单链表的增删查改和冒泡排序(C语言实验代码)

发布于:2022-12-12 ⋅ 阅读:(548) ⋅ 点赞:(0)

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Linknode{
       ElemType data;
       struct Linknode *next;
}LinkNode,*LinkList;
int n;
void menu();
void GreatLinkList(LinkList &L);
void VisitSortLinkList(LinkList &L);
int IsertList(LinkList &L);
int DeleteLinkList(LinkList &L,int s);
void GreatLinkList(LinkList &L)
{
    LinkNode *p;
    int i;
    //p=(LinkList)malloc(sizeof(LinkNode));
    //if(p==NULL){
    //       printf("分配内存失败!\n");
    //       return;
       //}
       printf("请输入元素个数:");
       scanf("%d",&n);
       for(i=1;i<=n;i++){
              p=(LinkList)malloc(sizeof(LinkNode));
    if(p==NULL){
           printf("分配内存失败!\n");
           return;
       }
              printf("倒数第%d个数:",i);
              scanf("%d",&p->data);
              //p->data=i;
              p->next=L->next;
              L->next=p;
       }
}
void VisitSortLinkList(LinkList &L){
       int i,j,temp;
       LinkNode *q1;
       LinkNode *q2;
       if(L->next==NULL){
              printf("该表为空!");
              return;
       }      
              q1=L;
              printf("排序前:");
              for(i=1;i<=n;i++)
                     {
                            printf("%d ",q1->next->data);
                            q1=q1->next;
                     }//遍历该单链表
                     printf("\n");
              for(i=1;i<=n;i++){
                     q2=L->next;
                     for(j=1;j<=n-1;j++){
                            if(q2->data>q2->next->data){
                            temp=q2->data;
                            q2->data=q2->next->data;
                            q2->next->data=temp;        
                            }
                            q2=q2->next; 
                     }
              }//排序该链表
       q1=L;
       printf("排序后:");
              for(i=1;i<=n;i++)
                     {
                            printf("%d ",q1->next->data);
                            q1=q1->next;
                     }      
                     printf("\n");

}
int IsertList(LinkList &L)
{

       LinkNode *p;
       LinkNode *q;
       LinkNode *t;
       int temp,i;
       q=L->next;
       t=L;
       temp=n;
       printf("请输入插入的数据:");
        p=(LinkList)malloc(sizeof(LinkNode));
        if(p==NULL){
          printf("分配内存失败!\n");
            return 0;
           }
       scanf("%d",&p->data);
       for(i=1;i<=temp;i++){
           if(p->data<=q->data){
                     p->next=q;
                     t->next=p;
                     n++;
                     return 1;
              }
              q=q->next;
              t=t->next;
           }
        if(i>temp){
            p->next=q;
            t->next=p;
            n++;
            return 1;
        }
}
int DeleteLinkList(LinkList &L,int s)
{
    LinkNode *p;
    LinkNode *t;
    t=L;
    p=L->next;
    int i,temp;
    temp=n;    
    if(!L){
        printf("该链表为空!\n");
        return 0;
    }
    for(i=1;i<=temp;i++){
        if(s==p->data){
            t->next=p->next;
            p=NULL;
            n--;
            return 1;
        }
        t=t->next;
        p=p->next;
    }
    if(i>temp){
        return -1;
    }
}
void menu()
{
       /*clrscr();*/
       printf("\n");
       printf("\t\t1.创建一个单链表\n\n");
       printf("\t\t2.遍历单链表并排序\n\n");
       printf("\t\t3.插入单链表\n\n");
       printf("\t\t4.删除单链表\n\n");
       printf("\t\t5.退出\n\n");
       printf("\tplease select:");
}
int main()
{
int x,m=1;
LinkList L;
L=(LinkList)malloc(sizeof(LinkNode));
if(L==NULL){
printf("分配内存失败!\n");
}
L->next=NULL;
while(m)
{
menu();
              scanf("%d",&x);
              switch(x)
       {
                     case 1:GreatLinkList(L);break;
                     case 2:VisitSortLinkList(L);break;
                     case 3:{
                         LinkNode *p;
                         int success;
                         success=IsertList(L);
                         if(success==1){
                             p=L;
                          printf("插入后:");
                       for(int i=1;i<=n;i++)
                       {
                       printf("%d ",p->next->data);
                       p=p->next;
                       }      
                       printf("\n");
                         }
                         break;
                     }
                     case 4:{
                            LinkNode *p;
                            int s,success;
                            printf("请输入要删除的数据:");
                            scanf("%d",&s);
                            success=DeleteLinkList(L,s);
                         if(success==0){
                             printf("该链表为空!\n");
                         }
                            if(success==-1){
                              printf("对不起,没有该数据\n");
                              }
                               if(success==1){
                                 p=L;
                          printf("删除后:");
                       for(int i=1;i<=n;i++)
                       {
                       printf("%d ",p->next->data);
                       p=p->next;
                       }      
                       printf("\n");
                             }
                             break;
                             }
                     case 5:printf("已释放单链表!");free(L);m=0;
              }
       }
}

该代码除了简单的增删查改之外,还新增了单链表的排序功能,利用了简单的冒泡排序,方便各位同学做实验进行参考哈哈哈

该代码是本人经过一夜深思熟虑并敲打,有什么不恰当之处欢迎各位大佬指出,不喜勿喷

本文含有隐藏内容,请 开通VIP 后查看