c語言輸入20個數,從小到大建立一個單鏈表
阿新 • • 發佈:2020-12-19
一、要求輸入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);//呼叫函式
}