陳祎智
實(shí)驗(yàn)報(bào)告<2> 1. 問題描述: 雙向鏈表的排序。
要求:
輸入一個(gè)雙向鏈表,顯示些雙向鏈表并對(duì)此雙向鏈表排序
2.課題分析(結(jié)構(gòu)圖):
3.數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì): typedef struct node { int info;
struct node *llink,*rlink;
}NODE; 雙向鏈表的排序 雙向鏈表存儲(chǔ)結(jié)構(gòu) 快速排序定義 輸入數(shù)據(jù)結(jié)點(diǎn)
4.流程圖
5.源程序:
#include<iostream.h> #include<stdlib.h> #include <stdio.h> 開始 創(chuàng)建鏈表 初始化鏈表 從中間分成兩部 排序鏈表 插入 10 個(gè)值 輸出排序鏈表 終止
typedef struct Link/*雙向鏈表結(jié)構(gòu)體*/ {
int data;
struct Link *lift;
struct Link *right; }linkx,*linky; linky Init();/*建立雙向鏈表*/ void PrLink(linky p);/*輸出雙向鏈表*/ linky Sort(linky head);/*對(duì)雙向鏈表排序*/ linky S head,linky one,linky two);/*任意交換雙向鏈表兩個(gè)結(jié)點(diǎn)的地址*/ void main(void) {
linky head;
head=Init();
head=Sort(head);
PrLink(head); } linky (Init())/*建立鏈表*/ {
linky p,q,head;
int n=0;
head=p=q=(linky)malloc(sizeof(linkx));
printf("排序前的鏈表: ");
scanf("%d",&p->data);/*輸入數(shù)據(jù)*/
head->lift=NULL;
n++;
while(n!=10)/*一直輸入到規(guī)定的數(shù)字個(gè)數(shù)停止*/ {
q=p;
p=(linky)malloc(sizeof(linkx));
scanf("%d",&p->data);/*輸入數(shù)據(jù)*/
q->right=p;
p->lift=q;
n++; }
p->right=NULL;
return(head); } linky S head,linky one,linky two)/*任意交換兩個(gè)結(jié)點(diǎn)*/ {linky temp;
if(one->lift==NULL&&two->right==NULL)/*首和尾巴的交換*/
{
if(one->right==two)/*只有兩個(gè)結(jié)點(diǎn)的情況下*/
{
two->right=one;
two->lift=NULL;
one->lift=two;
one->right=NULL;
head=two;
}
else/*有間隔的首尾交換*/
{
one->right->lift=two;
two->lift->right=one;
two->right=one->right;
one->lift=two->lift;
two->lift=one->right=NULL;
head=two;/*尾結(jié)點(diǎn)成為頭結(jié)點(diǎn)*/
}
}
else if(two->right==NULL)/*尾和任意一個(gè)交換*/
{
if(one->right==two)/*交換最后兩個(gè)結(jié)點(diǎn)*/
{
one->lift->right=two;
two->lift=one->lift;
two->right=one;
one->lift=two;
one->right=NULL;
}
else/*和前面其他結(jié)點(diǎn)交換*/
{
temp=two->lift;
temp->right=one;
one->lift->right=two;
one->right->lift=two;
two->lift=one->lift;
two->right=one->right;
one->lift=temp;
one->right=NULL;
}
}
else if(one->lift==NULL)/*頭和任意一個(gè)交換*/
{
if(one->right==two)/*交換頭兩個(gè)結(jié)點(diǎn)*/
{
two->right->lift=one;
one->right=two->right;
one->lift=two;
two->right=one;
two->lift=NULL;
head=two;
}
else/*頭結(jié)點(diǎn)和后面其他結(jié)點(diǎn)交換*/
{
temp=one->right;
temp->lift=two;
one->lift=two->lift;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=NULL;
head=two;/*交換的結(jié)點(diǎn)成為頭結(jié)點(diǎn)*/
}
}
else/*當(dāng)中的任意兩個(gè)交換*/
{
if(one->right==two)/*交換連在一起的兩個(gè)結(jié)點(diǎn)*/
{
temp=one->lift;
one->lift->right=two;
one->right->lift=two;
one->lift=two;
one->right=two->right;
two->right->lift=one;
two->right=one;
two->lift=temp;
}
else/*交換隔開的兩個(gè)結(jié)點(diǎn)*/
{
one->lift->right=two;
one->right->lift=two;
one->lift=two->lift;
temp=one->right;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=one->lift;
}
}
return(head); } linky Sort(linky head)/*對(duì)鏈表排序*/ {
linky i,j,t,p;
int max;
p=head;
for(i=p;i->right!=NULL;i=i->right)/*用選擇法的思想對(duì)這些結(jié)點(diǎn)排序*/
{
max=i->data;
for(j=i->right;j!=NULL;j=j->right)
if(j->data<max)
{
max=j->data;
t=j;
}
if(max!=i->data)/*假如沒有找到比 i 小的結(jié)點(diǎn)*/
{
head=S);/*因?yàn)樽罱K返回的是頭結(jié)點(diǎn),而頭結(jié)點(diǎn)又有可能變化,所以每次頭結(jié)點(diǎn)返回*/
i=t;
}
}
return(head); } void PrLink(linky p)/*輸出鏈表*/ {
linky q;
printf("排序后: ");
do
{
q=p;
printf("%d ",p->data);
p=p->right;
free(q);/*釋放輸出結(jié)點(diǎn)*/
}
while(p!=NULL);
}
6.調(diào)試記錄:
第一次輸入 136 134 158 123 197 124 156 170 103 101 實(shí)現(xiàn)排序
第二次調(diào)試 輸入 12367 15842 12564 13729 49875 1546 15423 15794 54612 1543
7.軟件說明
程序調(diào)試運(yùn)行成功后,排序前隨機(jī)輸入十個(gè)不同的數(shù)值,快速排序后將由小到大輸出這十個(gè)數(shù)值的排序。如上圖說明
. 8. 設(shè)計(jì)總結(jié)
一周的上機(jī)實(shí)踐課程結(jié)束了,我們也按要求完成了實(shí)踐內(nèi)容,這次上機(jī)實(shí)踐,使我鞏固了所學(xué)的計(jì)算機(jī)知識(shí),對(duì) C 語言知識(shí)有了更進(jìn)一步的了解。但是知識(shí)是學(xué)無止境的,我相信,這次的課程設(shè)計(jì)對(duì)我以后在計(jì)算機(jī)編程這方面有很好的指導(dǎo)意義,讓我通過這次實(shí)踐了解到計(jì)算機(jī)編程的冰山一角。我此次設(shè)計(jì)的雙向鏈表的排序程序雖然比較典型,對(duì)我們認(rèn)識(shí)數(shù)據(jù)結(jié)構(gòu)和 C 程序設(shè)計(jì)卻有很好的幫助。
在設(shè)計(jì)中我遇到了很多編程方面的難點(diǎn),在老師的辛勤指導(dǎo)和同學(xué)們的熱心幫助下,我慢慢的找到了解決問題的方法。在老師的指導(dǎo)下我學(xué)到很多實(shí)用的知識(shí),在此表示感謝!感謝老師和同學(xué)們的幫助和支持。
推薦訪問: 雙向 排序 鏈表在偉大祖國73華誕之際,我參加了單位組織的“光影鑄魂”主題黨日活動(dòng),集中觀看了抗美援朝題材影片《長津湖》,再一次重溫這段悲壯歷史,再一次深刻感悟偉大抗美援朝精神。1950年10月,新中國剛剛成立一年,
根據(jù)省局黨組《關(guān)于舉辦習(xí)近平談治國理政(第四卷)讀書班的通知》要求,我中心通過專題學(xué)習(xí)、專題研討以及交流分享等形式,系統(tǒng)的對(duì)《習(xí)近平談治國理政》(第四卷)進(jìn)行了深入的學(xué)習(xí)與交流,下面我就來談一談我個(gè)人
《習(xí)近平談治國理政》(第四卷)是在百年變局和世紀(jì)疫情相互疊加的大背景下,對(duì)以習(xí)近平同志為核心的黨中央治國理政重大戰(zhàn)略部署、重大理論創(chuàng)造、重大思想引領(lǐng)的系統(tǒng)呈現(xiàn)。它生動(dòng)記錄了新一代黨中央領(lǐng)導(dǎo)集體統(tǒng)籌兩個(gè)
《真抓實(shí)干做好新發(fā)展階段“三農(nóng)工作”》是《習(xí)近平談治國理政》第四卷中的文章,這是習(xí)近平總書記在2020年12月28日中央農(nóng)村工作會(huì)議上的集體學(xué)習(xí)時(shí)的講話。文章指出,我常講,領(lǐng)導(dǎo)干部要胸懷黨和國家工作大
在《習(xí)近平談治國理政》第四卷中,習(xí)近平總書記強(qiáng)調(diào),江山就是人民,人民就是江山,打江山、守江山,守的是人民的心。從嘉興南湖中駛出的小小紅船,到世界上最大的執(zhí)政黨,在中國共產(chǎn)黨的字典里,“人民”一詞從來都
黨的十八大以來,習(xí)近平總書記以馬克思主義戰(zhàn)略家的博大胸襟和深謀遠(yuǎn)慮,在治國理政和推動(dòng)全球治理中牢固樹立戰(zhàn)略意識(shí),在不同場(chǎng)合多次圍繞戰(zhàn)略策略的重要性,戰(zhàn)略和策略的關(guān)系,提高戰(zhàn)略思維、堅(jiān)定戰(zhàn)略自信、強(qiáng)化戰(zhàn)
《習(xí)近平談治國理政》第四卷集中展示了以習(xí)近平同志為核心的黨中央在百年變局和世紀(jì)疫情相互疊加背景下,如何更好地堅(jiān)持和發(fā)展中國特色社會(huì)主義而進(jìn)行的生動(dòng)實(shí)踐與理論探索;對(duì)于新時(shí)代堅(jiān)持和發(fā)展什么樣的中國特色社
在黨組織的關(guān)懷下,我有幸參加了區(qū)委組織部組織的入黨積極分子培訓(xùn)班。為期一周的學(xué)習(xí),學(xué)習(xí)形式多樣,課程內(nèi)容豐富,各位專家的講解細(xì)致精彩,對(duì)于我加深對(duì)黨的創(chuàng)新理論的認(rèn)識(shí)、對(duì)黨的歷史的深入了解、對(duì)中共黨員的
《習(xí)近平談治國理政》第四卷《共建網(wǎng)上美好精神家園》一文中指出:網(wǎng)絡(luò)玩命是新形勢(shì)下社會(huì)文明的重要內(nèi)容,是建設(shè)網(wǎng)絡(luò)強(qiáng)國的重要領(lǐng)域。截至2021年12月,我國網(wǎng)民規(guī)模達(dá)10 32億,較2020年12月增長4
剛剛召開的中國共產(chǎn)黨第十九屆中央委員會(huì)第七次全體會(huì)議上討論并通過了黨的十九屆中央委員會(huì)向中國共產(chǎn)黨第二十次全國代表大會(huì)的報(bào)告、黨的十九屆中央紀(jì)律檢查委員會(huì)向中國共產(chǎn)黨第二十次全國代表大會(huì)的工作報(bào)告和《