其實c語言鏈表超簡單教程的問題并不復(fù)雜,但是又很多的朋友都不太了解c語言鏈表菜鳥教程,因此呢,今天小編就來為大家分享c語言鏈表超簡單教程的一些知識,希望可以幫助到大家,下面我們一起來看看這個問題的分析吧!
c語言鏈表建立為什么要用引用符
引用符是為了使系統(tǒng)整體完整
c語言鏈表如何求50階乘和
50的階乘已經(jīng)很大了 要求近似值可以用double累乘很簡單 要求精確值就只能用大數(shù)模擬了 一下是大數(shù)算法: #include????? int?main()???? {???? ????int?n;???? ????int?a[9000];?//確保保存最終運算結(jié)果的數(shù)組足夠大???? ?????int?digit?=?1;?//位數(shù)???? ?????int?temp;???//階乘的任一元素與臨時結(jié)果的某位的乘積結(jié)果???? ?????int?i,?j,?carry;?//carry:進位???? ?????n=50;//求50! ????a[0]?=?1;???//將結(jié)果先初始化為1???? ????for?(?i=2;?i<=n;?i++?)??//開始階乘,階乘元素從2開始依次"登場"???? ????{??//按最基本的乘法運算思想來考慮,將臨時結(jié)果的每位與階乘元素相乘???? ?????????for(?j=1,?carry=0;??j<=digit;?j++?)???? ????????{???? ????????????temp?=?a[j-1]?*?i?+?carry;?//相應(yīng)階乘中的一項與當前所得臨時結(jié)果的某位相乘(加上進位)???? ??????????????a[j-1]?=?temp?%?10;?//更新臨時結(jié)果的位上信息???? ??????????????carry?=?temp?/?10;?//看是否有進位???? ?????????}???? ????????while(carry)???? ????????{????//如果有進位???? ??????????????a[++digit-1]?=?carry?%?10;?//新加一位,添加信息。位數(shù)增1???? ????????????carry?=?carry?/?10;?//看還能不能進位???? ?????????}???? ????}???? ????printf("n?!?=?");????//顯示結(jié)果???? ????for(j?=?digit;?j?>=1;j--)???? ????{???? ????????printf("%d",a[j-1]);???? ????}???? ????printf("\n");???? ????return?0;???? }
真心覺得C語言鏈表很抽象難學,該如何學習
我們都知道,數(shù)據(jù)結(jié)構(gòu)在編程領(lǐng)域是一門十分重要的知識,因為程序說白了就是數(shù)據(jù)的運算,那么數(shù)據(jù)運算時建立在數(shù)據(jù)存儲的基礎(chǔ)上的。雖然現(xiàn)在的高級語言在日常開發(fā)中可能用不到數(shù)據(jù)結(jié)構(gòu),因為語言本身給大家提供了豐富的數(shù)據(jù)存儲類型,比如說C#的List、Array、Dictionary、Queue等,又比如C++的STL,但是這并不代表我們就不需要去學習數(shù)據(jù)結(jié)構(gòu)了,如果后續(xù)你需呀做到架構(gòu)師,這門知識是不可或缺的。
下面小編就跟大家一起來看一下C/C++怎么去實現(xiàn)一個簡單的單向鏈表,希望從中能讓大家對鏈表有一個清晰的認識。
理解概念說起鏈表,我們是不是很容易想起‘鏈條啊
對,沒錯,就是這種一節(jié)一節(jié)連接起來的鏈條,我們用圖示將之形象化一下(畫的很丑,大家別介意哈~~):
如上圖,鏈條它每一節(jié)在物理上他其實是連續(xù)的對吧,是一節(jié)緊挨著一節(jié)。怎么樣,有沒有很想C/C++里的數(shù)組啊,也就是數(shù)據(jù)結(jié)構(gòu)里的順序表。但是這種不能動態(tài)增加啊,而實際開發(fā)中我們有時數(shù)組個數(shù)是不確定的,這怎么辦呢?能不能用一節(jié)加一節(jié),所以鏈表的概念就因此而生了。
我們能不能將鏈條的連接處(圖上紅點)斷開,但是又加上某種聯(lián)系,讓我能通過這種聯(lián)系通過前一個能夠找到后一個。這樣我們又想到什么?
家族比喻
這個比喻在鏈表中成立的先決條件是:(假設(shè)每家地址都只有前一家知道)否則就是樹形結(jié)構(gòu)了
這個比喻我覺得十分的適當,那就是家族。大家想,以前的家族大家都強調(diào)說住在一塊,房子都是一家挨著一家的,這樣的好處是我只需要知道家族的地址和你家排第幾我就能找到你家對吧,但是后面改革開放了,很多人背井離鄉(xiāng)發(fā)展,或者人多土地不夠了需要去別地建房子,但是血緣不能斷啊,于是我們就將各自的家庭地址互相聯(lián)系,那這樣,我是不是就可以這樣找你,我通過你大伯知道你二伯的地址,再通過你二伯得到你家的地址,然后去家地址上是不是就能找到你父親啦。
怎么樣,這樣我是不是就可以通過你大伯就能將你爸爸那一輩的所有家庭都找到啊,這就是鏈表。我們也用圖示將之形象化:
圖中一個節(jié)點分兩塊,一塊為存放數(shù)據(jù)的數(shù)據(jù)域(家庭成員),一塊為存放指向下一個結(jié)點的地址的指針稱為指針域(別人家的地址)。
創(chuàng)建鏈表接下來我們來簡單的創(chuàng)建一個鏈表:
1、首先你要構(gòu)造好一個節(jié)點的數(shù)據(jù)結(jié)構(gòu),為了簡單,我這里就存放一個整型數(shù)據(jù)和一個指向下一節(jié)點的指針
2、創(chuàng)建(數(shù)據(jù)來源為輸入)
代碼截圖并且在右上角附上了思路說明圖:其實核心就在中間節(jié)點p上,首先我是讓p和head指向同一塊內(nèi)存,這樣在新增第一個節(jié)點后通過p->next=temp;這行代碼將head的頭部作用確立,只要他的next指向第二個節(jié)點就可以了。這里要說一下,可能很多人不明白明明是
p->next=temp;那為什么head->next也會=temp,其實這就是指針的神奇之處,因為前面說過(如右上角圖,此時的p和head還是指向同一個地址,在這里p->next=temp就是講地址上的next賦值了,改變的是地址上的值,所以只要是指向這個地址的所有指針的next值都是一樣的)。
好,第一個節(jié)點加進去之后,后面的照樣走,循環(huán)就好了。最后需要注意的一個點是,最后一節(jié)點是沒有指向的,記得將之置為空。
測試驗收
我們測試一下:
運行看一下:
總結(jié)其實,鏈表的概念理解起來并不難,稍微難的是難在怎么用代碼去實現(xiàn)需要會靈活的運用指針
如何做好數(shù)據(jù)結(jié)構(gòu)的單鏈表
首先要熟悉鏈表的結(jié)構(gòu),即節(jié)點node。它是由一個自身指針和所需要存儲的數(shù)據(jù)組成的結(jié)構(gòu)體變量;
組成鏈表就是需要創(chuàng)建節(jié)點并通過指針相互連接,即結(jié)構(gòu)體中的指針指向另外一個節(jié)點;
當然還有一些技巧可以加快鏈表的操作效率,比如插入,刪除,查詢等
鏈表一般用來存儲一組數(shù)據(jù),如果計算的話,可能需要鏈表實現(xiàn)的棧,來計算四則運算表達式
C語言鏈表中如何實現(xiàn)對一組數(shù)據(jù)進行排序
#include<stdio.h>
#include<stdlib.h>
#defineNULL0
structstudent*creat();
structstudent*link(structstudent*head_a,structstudent*head_b);
voidprint(structstudent*head);
structstudent{
intnum;
floatscore[2];
structstudent*next;
}stu;
intmain(void)
{
structstudent*head_a;
structstudent*head_b,*head_c;
printf("請輸入a鏈表學生的數(shù)據(jù):000結(jié)束輸入\n");
head_a=creat();
print(head_a);
printf("請輸入b鏈表學生的數(shù)據(jù):000結(jié)束輸入\n");
head_b=creat();
print(head_b);
head_c=link(head_a,head_b);
printf("打印經(jīng)過排序之后的學生數(shù)據(jù),a,b鏈數(shù)據(jù)的結(jié)合\n");
print(head_c);
return0;
}
structstudent*creat()
{
intn=0;
structstudent*head,*p1,*p2;
p1=p2=(structstudent*)malloc(sizeof(structstudent));
scanf("%d%f%f",&p1->num,&p1->score[0],&p1->score[1]);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(sizeof(structstudent));
scanf("%d%f%f",&p1->num,&p1->score[0],&p1->score[1]);
}
p2->next=NULL;
returnhead;
}
voidprint(structstudent*head)
{
structstudent*p;
p=head;
while(p!=NULL)
{
printf("%-10d%-10.1f%-10.1f\n",p->num,p->score[0],p->score[1]);
p=p->next;
}
return;
}
structstudent*link(structstudent*head_a,structstudent*head_b)
{
intn,m;
m=n=0;
structstudent*head,*p1,*p2,*p3,*q;//q是在冒泡排序是(共需N-1趟排序)每趟的最后一次指針p1的位置,開始時q為Null
p1=head_a;
p2=head_b;
head=head_a;
while(p1->next!=NULL)
{p1=p1->next;n++;}
p1->next=p2;
p1=head_a;
while(p1!=NULL)
{
p1=p1->next;
n++;//n是計算鏈表的節(jié)點數(shù),以備后面的排序用
}
q=NULL;
p1=head_a;
p2=p1->next;
while(m<n)
{
m++;
//以下是采用冒泡法進行排序
while(p2!=q)
{
if(p1->num>p2->num)
{
if(head==p1)head=p2;
elsep3->next=p2;
p1->next=p2->next;p2->next=p1;
//以下是按照p3p1p2排序
p3=p2;p2=p1->next;
}
else
{
p3=p1;p1=p1->next;p2=p2->next;
}
}
q=p1;p1=head;p2=p1->next;
}
return(head);
}
OK,本文到此結(jié)束,希望對大家有所幫助。