C语言实现单向链表的增删改查和排序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/* 
一、单向链表的增删改查
二、链表的排序(从大到小和从小到大)

 */
typedef struct linklist{
    int num;
    struct linklist *next;
} LinkList;
int element_num;//全局变量,表内元素个数
LinkList *InitList();//初始化头指针
void CreateList(LinkList *L,int n);//建立单向链表
void DisplayList(LinkList *L);//遍历链表
void DestroyList(LinkList *L);//释放整个链表
void InsertList(LinkList *L);//向position位置插入num数据
void DeleteList(LinkList *L);//删除
void FindElementInList(LinkList *L);//查找链表中的值
void ChangeElementInList(LinkList *L);//修改链表中某个位置的值
void choose(LinkList *L);//选择操作(插入,删除,查询,修改)
void ListSort(LinkList *L);//冒泡排序,由小到大和由大到小
void main()
{
    LinkList *list_one;
    int n;
    printf("please input the element quantity in the list:");
    scanf("%d",&n);
    list_one=InitList();
    CreateList(list_one,n);
    DisplayList(list_one);
    choose(list_one);
    DestroyList(list_one);
}

LinkList *InitList()//初始化头指针
{
    LinkList *L;
    L=(LinkList *)malloc(sizeof(LinkList));
    L->next=NULL;
    return L;
}
void CreateList(LinkList *l,int n)//建立链表
{
    LinkList *p,*q;
    int i;
    p=l;
    srand((unsigned)time(NULL));
    for(i=0;i<n;i++)
    {
        q=(LinkList *)malloc(sizeof(LinkList));
        q->num=rand()%10;
        //scanf("%d",&(q->num));
        q->next=NULL;
        p->next=q;
        p=q;
        printf("%d,",q->num);
    }
    printf("input done\n");
}

void DisplayList(LinkList *L)//遍历列表
{
    LinkList *p;
    p=L->next;
    element_num=0;
    printf("element in the list:\n");
    while(1)
    {
        printf("%d\t",p->num);
        element_num++;
        if(p->next==NULL)
            break;
        p=p->next;
    }
    printf("Now there are %d elements in the list\n",element_num);
}

void DestroyList(LinkList *L)//释放整个链表
{
    LinkList *p;
    while(L!=NULL)
    {
        p=L;
        L=L->next;
        free(p);
    }
    if(L==NULL)
        printf("memory has been freed.");
}

void InsertList(LinkList *L)//插入
{
    LinkList *p,*q;
    int i,position,num;
    p=L;
    printf("please input the position and the number:");
    scanf("%d%d",&position,&num);
    for(i=0;i<position-1;i++)
    {
        p=p->next;
    }
    q=(LinkList *)malloc(sizeof(LinkList));
    q->num=num;
    q->next=p->next;
    p->next=q;
}

void DeleteList(LinkList *L)//删除
{
    LinkList *p,*q;
    int i,position;
    p=L;
    printf("please input the position:");
    scanf("%d",&position);
    for(i=0;i<position;i++)
    {
        q=p;
        p=p->next;
    }
    q->next=p->next;
    free(p);
}

void FindElementInList(LinkList *L)//查找链表中的值
{
    int num,position=1;
    LinkList *p;
    p=L->next;
    printf("please input the number which you want to find:");
    scanf("%d",&num);
    while(p!=NULL)
    {
        if(p->num==num)
        {
            printf("the number is in %d position\n");
        }
        else
        {
            p=p->next;
            position++;
        }
    }
}

void ChangeElementInList(LinkList *L)//修改链表中某个位置的值
{
    int changed,position;
    int i;
    LinkList *p;
    p=L;
    printf("please input the position where you want to change and the number:");
    scanf("%d%d",&changed,&position);
    for(i=0;i<position;i++)
    {
        p=p->next;
    }
    p->num=changed;
}

void choose(LinkList *L)//选择操作(插入,删除,查询,修改)
{
    printf("please choose what you want to do from the following options:\n");
    printf("1:Insert\n2:Delete\n3:select\n4:change\n5:sort\n0:quit\n");
    getchar();
    switch (getchar())
    {
    case '1':
        InsertList(L);
        DisplayList(L);
        choose(L);
        break;
    case '2':
        DeleteList(L);
        DisplayList(L);
        choose(L);
        break;
    case '3':
        FindElementInList(L);
        DisplayList(L);
        choose(L);
        break;
    case '4':
        ChangeElementInList(L);
        DisplayList(L);
        choose(L);
        break;
    case '5':
        ListSort(L);
        DisplayList(L);
        choose(L);
        break;
    default:
        break;
    }
}

void ListSort(LinkList *L)//冒泡排序(由大到小和由小到大)
{
    int temp,i,j;
    LinkList *p;
    p=L->next;
    printf("please input the way that you want to sort:\n1:from big to small\n2:from little to large\n");
    getchar();
    if(getchar()=='1')
    {
        for(i=0;i<element_num-1;i++)
        {
            for(j=0;j<element_num-1-i;j++)
            {
                printf("%dand%d\n",p->num,p->next->num);
                if(p->num<p->next->num)
                    {
                        temp=p->next->num;
                        p->next->num=p->num;
                        p->num=temp;    
                    }
                p=p->next;
            }
            p=L->next;
        }
    }
    else
    {
        for(i=0;i<element_num-1;i++)
        {
            for(j=0;j<element_num-1-i;j++)
            {
                if(p->num>p->next->num)
                    {
                        temp=p->next->num;
                        p->next->num=p->num;
                        p->num=temp;
                    }
                p=p->next;
            }
            p=L->next;
        }
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值