c语言链表插入法求解下列问题?

 我来答
自我编程
2020-05-20 · 科技优质答主
自我编程
采纳数:1481 获赞数:4282

向TA提问 私信TA
展开全部

根据题意:

一、链表创建:根据输入的数字,动态创建任意多个节点插入链表。(题目规定n<=40,如不想使用malloc动态申请内存,需直接定义最大上限40个节点)。

二、链表排序:交换节点内容(不是地址),保留链表指针的值(*next的值)。

三、打印链表:利用链表指针遍历链表。

四、对动态申请的链表地址空间释放(在本程序中创建后程序就结束了,即使不写free释放,结束后也会释放。但在复杂程序中调用创建,后续还有代码,需像我代码中写函数动释放不用的内存,避免浪费)。

下面是代码:

#include <stdio.h>

#include <malloc.h>

typedef struct numStruct

{

    int num;

    struct numStruct *next;

}NST;

NST *insert2List(int num);//根据数字创建节点(动态),插入链表(首次自动生成头节点),成功返回头节点,失败返回NULL。

void showList(NST *nsthead);//打印链表

void px(NST *nsthead);//链表排序

void freeList(NST *nsthead);//释放链表内存

int main()

{

    NST *nsthead=NULL;

    int i=0,n=50,*nums=NULL;

    while(n>40)

        scanf("%d",&n);

    nums=(int *)malloc(sizeof(int)*n);

    if(!nums) return 1;

    while(i<n)

        scanf("%d",&nums[i++]);

    i=0;

    while(i<n)

        nsthead=insert2List(nums[i++]);

    px(nsthead);

    showList(nsthead);

    freeList(nsthead);

    return 0;

}

void freeList(NST *nsthead)

{

    NST *temp=NULL,*nst=NULL;

    if(nsthead)

    {

        nst=nsthead->next;

        while(nst!=NULL)

        {

            temp=nst;

            nst=nst->next;

            free(temp);

        }

    }

    free(nsthead);

}

void showList(NST *nsthead)

{

    if(nsthead)

        while(nsthead->next!=NULL)

        {

            printf("%d ",nsthead->next->num);

            nsthead=nsthead->next;

        }

    printf("\n");

}

void px(NST *nsthead)

{

    NST *nt1=NULL,*nt2=NULL,ntTemp,*nextSave=NULL;

    if(nsthead)

    {

        nt1=nsthead->next;

        while(nt1)

        {

            nt2=nt1->next;

            while(nt2)

            {

                if(nt1->num>nt2->num)

                {

                    ntTemp=*nt1;

                    nextSave=nt1->next;

                    *nt1=*nt2;

                    nt1->next=nextSave;

                    nextSave=nt2->next;

                    *nt2=ntTemp;

                    nt2->next=nextSave;

                }

                nt2=nt2->next;

            }

            nt1=nt1->next;

        }

    }

}

NST *insert2List(int num)

{

    static NST *nsthead=NULL,*nstTail=NULL;

    NST *nstNew=NULL;


    nstNew=(NST *)malloc(sizeof(NST));

    if(!nstNew) return NULL;

    nstNew->next=NULL;

    nstNew->num=num;

    if(!nsthead)

    {

        nsthead=(NST *)malloc(sizeof(NST));

        if(!nsthead) return NULL;

        nsthead->next=nstNew;

    }

    else

        nstTail->next=nstNew;

    nstTail=nstNew;

    return nsthead;

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式