C语言单链表插入结点

想知道怎么插入最后一个结点,
比如:
5
1 2 3 4 5
6
我写的代码比较不了最后一个结点,1前面可以插入0,但是5后面插入不了6

img

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*Linklist;

Linklist Tail_insert(Linklist L,int a[],int i)
{
    int j;
    Linklist p,r;
    L=(Linklist)malloc(sizeof(LNode));
    L->next=NULL;
    r=L;
    for(j=0;j<i;++j)
    {
        p=(Linklist)malloc(sizeof(LNode));
        p->data=a[j];
        p->next=NULL;
        r->next=p;
        r=p;
    }
    
    return L;
}

Linklist Insert(Linklist L,int a[],int k,int i)
{
    int j;
    j=i;
    Linklist p,s;
    p=(Linklist)malloc(sizeof(LNode));
    s=(Linklist)malloc(sizeof(LNode));
    p=L;
    s->data=k;
    while(1)
    {
        if((p->next->data)>(s->data))
        {
            s->next=p->next;
            p->next=s;
            break;
        }
        p=p->next;
    }
    return L;
}

void printfLinklist(Linklist L)
{
    Linklist p;
    p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

void distroyLinklist(Linklist L)
{
    Linklist p;
    p=L;
    while(L!=NULL)
    {
        L=L->next;
        free(p);
        p=L;
    }
}

int main()
{
    int i,j,k,n,m;
    int a[100];
    i=0;
    scanf("%d",&m); 
    for(i=0;i<m;i++)
    {
        scanf("%d",&n);
        a[i]=n;
    }
    scanf("%d",&k);
    j=i;
    Linklist L;
    L=Tail_insert(L,a,i);
    L=Insert(L,a,k,i);
    printfLinklist(L);
    distroyLinklist(L); 
    return 0;
}  


  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7670939
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言试题八十一之利用递归函数调用方式,将所输入的5个字符,相反顺序打印
  • 除此之外, 这篇博客: C语言小练习5中的 五、给一个不多余5位的正整数,要求如下:①求出它是几位数②分别输出每一位数字③按逆序输出各位数字。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这个题比较有意思,其实就是先判断位数,再逆序输出每一位,我感觉涉及到了两个东西,所以写了一下。

    代码如下:

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	int num,y,x1,x2,x3,x4,x5,place;
    	scanf("%d",&num);
    	place=log10((double)num)+1;//
    	/********** Begin **********/
    	y=num;
    	x1=y%10;
    	y=y/10;
    	x2=y%10;
    	y=y/10;
    	x3=y%10;
    	y=y/10;
    	x4=y%10;
    	y=y/10;
    	x5=y%10;
    	printf("%d为%d位数\n",num,place);
    	switch(place){
    	case 1:printf("顺序输出为:%d\n",x1);printf("逆序输出为:%d\n",x1);break;
    	case 2:printf("顺序输出为:%d,%d\n",x2,x1);printf("逆序输出为:%d,%d\n",x1,x2);break;
    	case 3:printf("顺序输出为:%d,%d,%d\n",x3,x2,x1);printf("逆序输出为:%d,%d,%d\n",x1,x2,x3);break;
    	case 4:printf("顺序输出为:%d,%d,%d,%d\n",x4,x3,x2,x1);printf("逆序输出为:%d,%d,%d,%d\n",x1,x2,x3,x4);break;
    	case 5:printf("顺序输出为:%d,%d,%d,%d,%d\n",x5,x4,x3,x2,x1);printf("逆序输出为:%d,%d,%d,%d,%d\n",x1,x2,x3,x4,x5);break;}
    
    	/********** End **********/
    	return 0;
    }
    
  • 您还可以看一下 尹成老师的C语言系列之 数组与算法实战课程中的 5.斐波那契数组小节, 巩固相关知识点

修改如下,改动处见注释,供参考:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*Linklist;

Linklist Tail_insert(Linklist L,int a[],int i)
{
    int j;
    Linklist p,r;
    L=(Linklist)malloc(sizeof(LNode));
    L->next=NULL;
    r=L;
    for(j=0;j<i;++j)
    {
        p=(Linklist)malloc(sizeof(LNode));
        p->data=a[j];
        p->next=NULL;
        r->next=p;
        r=p;
    }
    return L;
}

Linklist Insert(Linklist L,int a[],int k,int i)
{
    int j;
    j=i;
    Linklist p,s;
    //p=(Linklist)malloc(sizeof(LNode)); 多余
    s=(Linklist)malloc(sizeof(LNode));
    p=L;
    s->data=k;
    s->next=NULL;                       // 修改
    while(p->next && p->next->data < s->data)//while(1) 修改
    {
        //if((p->next->data)>(s->data))修改
        //{                            修改
        //    s->next=p->next;         修改
        //    p->next=s;               修改
        //    break;                   修改
        //}                            修改
        p=p->next;
    }
    if (p == L){           //修改
        s->next=L->next;   //修改
        L->next=s;         //修改
    }
    else{                  //修改
        s->next=p->next;
        p->next=s;
    }
    return L;
}

void printfLinklist(Linklist L)
{
    Linklist p;
    p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

void distroyLinklist(Linklist L)
{
    Linklist p;
    p=L;
    while(L!=NULL)
    {
        L=L->next;
        free(p);
        p=L;
    }
}

int main()
{
    int i,j,k,n,m;
    int a[100];
    i=0;
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
        scanf("%d",&n);
        a[i]=n;
    }
    scanf("%d",&k);
    j=i;
    Linklist L;
    L=Tail_insert(L,a,i);
    L=Insert(L,a,k,i);
    printfLinklist(L);
    distroyLinklist(L); 
    return 0;
}