1. 程式人生 > 其它 >c語言輸入20個數,從小到大建立一個單鏈表

c語言輸入20個數,從小到大建立一個單鏈表

技術標籤:C語言連結串列演算法c語言

一、要求輸入20個數,按照從小到大的順序存入連結串列中,可以分四步:獲取資料、進行排序、插入連結串列、列印連結串列。

1.定義一個整型陣列,用來儲存獲得的20個數:

int a[20];
int i;
for(i=0;i<20;i++)
{
    scanf("%d",&a[i]);
}

注意:①"%d"不能寫成"%d ",千萬不要加空格!!!否則就要多輸入一個數;②&a[i]不能寫成a或a[i]或&a,如果這麼幹了,後面輸出的資料就很迷了,但是之前寫獲取字串的表示式時,("%s",&str)和("%s",str)都可以來著,嗯先記著吧。

2.對獲得的20個數進行排序,排序演算法很多,但我都不熟,暫時用最容易理解的氣泡排序:

int j,temp;
for(i=0;i<19;i++)//20個數,則外迴圈19次
{
    for(j=19;j>i;j--)//從右往左冒泡,每次迴圈都將最小的數放在最左邊
    {
        if(a[j]<a[j-1])
        {
            temp=a[j];
            a[j]=a[j-1];
            a[j-1]=temp;
        }
    }
}

附一篇排序演算法動態演示圖連結https://www.cnblogs.com/onepixel/articles/7674659.html

3.將排好序的20個數按升序插入單鏈表中,可以採用頭插法或尾插法:

typedef struct node
{
    int data;
    struct node *next;
}*LinkedList;//定義一個單鏈表

//尾插法
LinkedList LinkedListCreateTailL(int a[20])
{
    LinkedList p,L,tail;
    int i=0;
    L=(struct node*)malloc(sizeof(struct node));//給頭結點分配記憶體
    tail=L;//設定一個尾指標備用

    for(i=0;i<20;i++)
    {
        p=(struct node*)malloc(sizeof(struct node));
        p->data=a[i];
        tail->next=p;
        tail=p;//用尾指標儲存每一個新結點
    }
    tail->next=NULL;//資料插入完畢後,最後一個尾結點指向空    
    return L;
}

4.將單鏈表打印出來:

void LinkedListPrint(LinkedList L)
{
    LinkedList p;
    p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);//這裡%d後面要加一個空格,使打印出的資料空格隔開
        p=p->next;//將p結點往下移一位
    }
}

注意寫完整程式碼時標頭檔案include<stdlib.h>不可少,關於單鏈表的知識參看這篇文章,總結的很詳細https://blog.csdn.net/wp1603710463/article/details/50989500

還有百度百科幫助理解https://baike.baidu.com/item/%E5%8D%95%E9%93%BE%E8%A1%A8/3228368

剛開始不太理解p、p->data和p-next的關係,多瞅瞅圖和百度才搞明白,假設一個單鏈表的頭結點是L,緊接著是結點p,然後是結點q,那麼L->next=p是說頭結點的指標域存的是p結點的地址,所以指向p結點,而在p結點中,p->data存的是p的資料內容,p-next存的是後一個結點q的地址。

二、附完整程式碼和執行結果:(codeblocks可執行,手機上C Compiler也可以執行)

#include<stdio.h>
#include<stdlib.h>
#define N 20 //用define來設定輸入資料的個數,方便後期更改或除錯

typedef struct node
{
    int data;
    struct node *next;
}*LinkedList;
//用尾插法插入單鏈表L
LinkedList LinkedListCreateTailL(int a[N])
{
    LinkedList p,L,tail;
    int i=0;
    L=(struct node*)malloc(sizeof(struct node));
    tail=L;

    for(i=0;i<N;i++)
    {
        p=(struct node*)malloc(sizeof(struct node));
        p->data=a[i];
        tail->next=p;
        tail=p;
    }
    tail->next=NULL;
    return L;
}
//列印單鏈表L
void LinkedListPrint(LinkedList L)
{
    LinkedList p;
    p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);//注意是p->data而不是a[i]
        p=p->next;
    }
}
//主函式
void main()
{
    int i,j,a[N];
    int temp=0;
    LinkedList L;
    printf("請輸入N個數:\n");
    for(i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }

    for(i=0;i<N-1;i++)//氣泡排序
    {
        for(j=N-1;j>i;j--)
        {
            if(a[j]<a[j-1])
            {
                temp=a[j];
                a[j]=a[j-1];
                a[j-1]=temp;
            }
        }
    }

    L=LinkedListCreateTailL(a);
    LinkedListPrint(L);//呼叫函式
}