




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-單鏈表優(yōu)質(zhì)資料(可以直接使用,可編輯優(yōu)質(zhì)資料,歡迎下載)
目錄數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-單鏈表優(yōu)質(zhì)資料(可以直接使用,可編輯優(yōu)質(zhì)資料,歡迎下載)TOC\o"1-3"\h\u166971選題背景2232202方案與論證3258412.1鏈表的概念和作用3265912.3算法的設(shè)計(jì)思想4187062.4相關(guān)圖例5150312.4.1單鏈表的結(jié)點(diǎn)結(jié)構(gòu)5277712.4.2算法流程圖5122303實(shí)驗(yàn)結(jié)果6220343.1鏈表的建立6258113.2單鏈表的插入6320213.3單鏈表的輸出7190563.4查找元素7135493.5單鏈表的刪除8325073.6顯示鏈表中的元素個(gè)數(shù)(計(jì)數(shù))9165624結(jié)果分析1098784.1單鏈表的結(jié)構(gòu)1050594.2單鏈表的操作特點(diǎn)10204464.2.1順鏈操作技術(shù)10123154.2.2指針保留技術(shù)10131654.3鏈表處理中的相關(guān)技術(shù)10226005設(shè)計(jì)體會(huì)及今后的改進(jìn)意見1119571參考文獻(xiàn)1214900附錄代碼:131選題背景陳火旺院士把計(jì)算機(jī)60多年的發(fā)展成就概括為五個(gè)“一”:開辟一個(gè)新時(shí)代信息時(shí)代,形成一個(gè)新產(chǎn)業(yè)信息產(chǎn)業(yè),產(chǎn)生一個(gè)新科學(xué)計(jì)算機(jī)科學(xué)與技術(shù),開創(chuàng)一種新的科研方法計(jì)算方法,開辟一種新文化計(jì)算機(jī)文化,這一概括深刻影響了計(jì)算機(jī)對(duì)社會(huì)發(fā)展所產(chǎn)生的廣泛而深遠(yuǎn)的影響。數(shù)據(jù)結(jié)構(gòu)和算法是計(jì)算機(jī)求解問題過程的兩大基石。著名的計(jì)算機(jī)科學(xué)家P.Wegner指出,“在工業(yè)革命中其核心作用的是能量,而在計(jì)算機(jī)革命中其核心作用的是信息”。計(jì)算機(jī)科學(xué)就是“一種關(guān)于信息結(jié)構(gòu)轉(zhuǎn)換的科學(xué)”。信息結(jié)構(gòu)(數(shù)據(jù)結(jié)構(gòu))是計(jì)算機(jī)科學(xué)研究的基本課題,數(shù)據(jù)結(jié)構(gòu)又是算法研究的基礎(chǔ)。2方案與論證2.1鏈表的概念和作用鏈表是一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),鏈表屬于線性表,采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),也是常用的動(dòng)態(tài)存儲(chǔ)方法。鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:元素(數(shù)據(jù)元素的映象)+
指針(指示后繼元素存儲(chǔ)位置),元素就是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)單元,指針就是連接每個(gè)結(jié)點(diǎn)的地址數(shù)據(jù)。以“結(jié)點(diǎn)的序列”表示線性表稱作線性鏈表(單鏈表)單鏈表是鏈?zhǔn)酱嫒〉慕Y(jié)構(gòu),為找第i個(gè)數(shù)據(jù)元素,必須先找到第i-1個(gè)數(shù)據(jù)元素。因此,查找第i個(gè)數(shù)據(jù)元素的基本操作為:移動(dòng)指針,比較j和i單鏈表1、鏈接存儲(chǔ)方法鏈接方式存儲(chǔ)的線性表簡稱為鏈表(LinkedList)。鏈表的具體存儲(chǔ)表示為:①用一組任意的存儲(chǔ)單元來存放線性表的結(jié)點(diǎn)(這組存儲(chǔ)單元既可以是連續(xù)的,也可以是不連續(xù)的)②鏈表中結(jié)點(diǎn)的邏輯次序和物理次序不一定相同。為了能正確表示結(jié)點(diǎn)間的邏輯關(guān)系,在存儲(chǔ)每個(gè)結(jié)點(diǎn)值的同時(shí),還必須存儲(chǔ)指示其后繼結(jié)點(diǎn)的地址(或位置)信息(稱為指針(pointer)或鏈(link))注意:鏈?zhǔn)酱鎯?chǔ)是最常用的存儲(chǔ)方式之一,它不僅可用來表示線性表,而且可用來表示各種非線性的數(shù)據(jù)結(jié)構(gòu)。2、鏈表的結(jié)點(diǎn)結(jié)構(gòu)┌───┬───┐│data│next│└───┴───┘data域--存放結(jié)點(diǎn)值的數(shù)據(jù)域next域--存放結(jié)點(diǎn)的直接后繼的地址(位置)的指針域(鏈域)注意:①鏈表通過每個(gè)結(jié)點(diǎn)的鏈域?qū)⒕€性表的n個(gè)結(jié)點(diǎn)按其邏輯順序鏈接在一起的。②每個(gè)結(jié)點(diǎn)只有一個(gè)鏈域的鏈表稱為單鏈表(SingleLinkedList)。3、頭指針head和終端結(jié)點(diǎn)指針域的表示單鏈表中每個(gè)結(jié)點(diǎn)的存儲(chǔ)地址是存放在其前趨結(jié)點(diǎn)next域中,而開始結(jié)點(diǎn)無前趨,故應(yīng)設(shè)頭指針head指向開始結(jié)點(diǎn)。注意:鏈表由頭指針唯一確定,單鏈表可以用頭指針的名字來命名。終端結(jié)點(diǎn)無后繼,故終端結(jié)點(diǎn)的指針域?yàn)榭?,即NULL。2.2實(shí)驗(yàn)的基本要求(軟硬件)用VC++6.0軟件平臺(tái),操作系統(tǒng):WindowsXP硬件:內(nèi)存要求:內(nèi)存大小在256MB,其他配置一般就行。2.3算法的設(shè)計(jì)思想(a)定義一個(gè)創(chuàng)建鏈表的函數(shù),通過該頭插法創(chuàng)建一個(gè)帶頭結(jié)點(diǎn)的鏈表,在接下來的鏈表操作中使用。(b)定義輸出鏈表的算法,遍歷結(jié)點(diǎn)的指針域判斷是否為空,如果不為空則輸出其數(shù)據(jù)域,直到指針域?yàn)榭諡橹?。(c)定義一個(gè)遍歷查找的算法,通過遍歷的數(shù)據(jù)域,分別與要查詢的元素進(jìn)行比較,如果查找到則返回并輸出,如入查找失敗則返回錯(cuò)誤提示信息。(d)定義插入結(jié)點(diǎn)的算法,首先查找指針域?yàn)榭盏慕Y(jié)點(diǎn),并申請空間插入在結(jié)點(diǎn)的后邊,并且將其指針域置空。(e)定義刪除節(jié)點(diǎn)的操作,這個(gè)算法用于對(duì)鏈表中某個(gè)多余節(jié)點(diǎn)的刪除工作,其關(guān)鍵在于前驅(qū)結(jié)點(diǎn)的保留,查找到需刪除的結(jié)點(diǎn),將其刪除,并將其后繼結(jié)點(diǎn)連到其前驅(qū)結(jié)點(diǎn)。2.4相關(guān)圖例2.4.1單鏈表的結(jié)點(diǎn)結(jié)構(gòu)如圖2-1所示,為單鏈表的結(jié)點(diǎn)結(jié)構(gòu)示意圖:Data域Next域Data域Next域圖2-1單鏈表的結(jié)點(diǎn)結(jié)構(gòu)2.4.2算法流程圖如圖2-2所示,為此算法流程圖:開始開始定義結(jié)構(gòu)體Node定義結(jié)構(gòu)體Node構(gòu)建各種對(duì)鏈表操作的函數(shù)(插入、刪除、查找、輸出),并寫出相應(yīng)的算法及實(shí)現(xiàn)過程創(chuàng)建一個(gè)單鏈表,用于之前所定義的函數(shù)對(duì)其進(jìn)行操作按要求輸出結(jié)果結(jié)束圖2-2算法流程圖3實(shí)驗(yàn)結(jié)果3.1鏈表的建立圖3-1鏈表的建立3.2單鏈表的插入圖3-2單鏈表的插入3.3單鏈表的輸出圖3-3輸出單鏈表元素3.4查找元素圖3-4查找成功圖3-5查找失敗3.5單鏈表的刪除圖3-6刪除成功圖3-6刪除失敗3.6顯示鏈表中的元素個(gè)數(shù)(計(jì)數(shù))圖3-7輸出長度4結(jié)果分析4.1單鏈表的結(jié)構(gòu)一般情況下,使用鏈表,只關(guān)心鏈表中結(jié)點(diǎn)間的邏輯順序,并不關(guān)心每個(gè)結(jié)點(diǎn)的實(shí)際存儲(chǔ)位置,因此通常情況下用箭頭來表示鏈域中的指針,于是鏈表就可以更直觀的畫成用箭頭鏈接起來的結(jié)點(diǎn)序列,如下圖所示:ABABCDE^H圖4-1單鏈表的示例圖4.2單鏈表的操作特點(diǎn)4.2.1順鏈操作技術(shù)從“頭”開始,訪問單鏈表L中的結(jié)點(diǎn)i(p指向該節(jié)點(diǎn))時(shí),由于第i個(gè)結(jié)點(diǎn)的地址在第i-1個(gè)結(jié)點(diǎn)(pre指向該結(jié)點(diǎn),為p的前驅(qū))的指針域中存放,查找必須從單鏈表的“首結(jié)點(diǎn)”開始(p=L);通過p=p->next并輔助計(jì)數(shù)器來實(shí)現(xiàn)。4.2.2指針保留技術(shù)通過對(duì)第i個(gè)結(jié)點(diǎn)進(jìn)行插入、刪除等操作時(shí),需要對(duì)第i-1個(gè)結(jié)點(diǎn)的指針域進(jìn)行鏈址操作(pre->next),因此在處理過程中始終需要維持當(dāng)前指針p與其前驅(qū)指針pre的關(guān)系,將這種技術(shù)稱為“指針保留技術(shù)”。4.3鏈表處理中的相關(guān)技術(shù)1)單鏈表與多重鏈表的差別在于指針域的個(gè)數(shù)。2)判斷當(dāng)前結(jié)點(diǎn)p是否為表尾。一半鏈表中,p結(jié)點(diǎn)是表尾的條件是:該節(jié)點(diǎn)的后繼結(jié)點(diǎn)為空指針,即p->next==NULL;3)鏈表的長度并未顯示保存。由于鏈表是動(dòng)態(tài)生成的結(jié)構(gòu),其長度要通過順鏈查找到表尾得到。因此在處理鏈表時(shí),往往是以當(dāng)前處理結(jié)點(diǎn)p是否為表尾作為控制條件,而不是長度n作為控制條件。5設(shè)計(jì)體會(huì)及今后的改進(jìn)意見通過這次實(shí)驗(yàn)加深了我對(duì)于單鏈表的進(jìn)一步了解,了解到了單鏈表在內(nèi)存中的存儲(chǔ)結(jié)構(gòu),最重要的是學(xué)會(huì)了如何運(yùn)用C語言將單鏈表的建立,插入、刪除、添加等操作。在程序?qū)崿F(xiàn)中也遇到了一些困難,在單鏈表初始化時(shí),使用了0作為結(jié)束輸入符,導(dǎo)致單鏈表不能存儲(chǔ)數(shù)據(jù)0;單鏈表中只能存儲(chǔ)相同類型的數(shù)據(jù),在存儲(chǔ)不同類型的數(shù)據(jù)時(shí)需要改變輸入結(jié)束標(biāo)志,程序通用性比較差。在進(jìn)行程序設(shè)計(jì)的時(shí)候沒有考慮好刪除和查找的方式,只進(jìn)行了輸入元素的查找和刪除,而且進(jìn)行鏈表的插入時(shí),只考慮了頭插法在結(jié)尾插入,而沒有考慮輸入結(jié)點(diǎn)插入等,程序的靈活性比較低。通過這次課程設(shè)計(jì),讓我充分認(rèn)識(shí)到數(shù)據(jù)結(jié)構(gòu)在編寫程序方面的重要地位。不僅僅是單鏈表的操作,還有棧和隊(duì)列等特殊的單鏈表操作,以及其他一些常用的數(shù)據(jù)結(jié)構(gòu)對(duì)于程序的效率和內(nèi)存使用有很大的幫助。我希望在接下來的學(xué)習(xí)中收獲更多的東西。參考文獻(xiàn)[1]耿國華.數(shù)據(jù)結(jié)構(gòu)--用C語言描述[M].北京:高等教育出版社,2021.6.[2]譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2004.6.附錄代碼:結(jié)構(gòu)體定義:#pragmaonce#include<stdio.h>#include<stdlib.h>enummy_enum{_EXIT,_CREATE,_INSERT,_PRINT,_SEARCH,_DELETE,_COUNT,};staticintcount=0;typedefintElemtype;typedefstructNode/*單鏈表結(jié)構(gòu)體的定義*/{Elemtypedata;structNode*next;}Node,*LinkList;voidtest();/*測試函數(shù)*/voidmain_menu();//主菜單函數(shù)voidCreatFromHead(LinkList*l);/*頭插法建立單鏈表*/voidInsert(LinkListl);//單鏈表的插入voidPrint(LinkListl);/*單鏈表的輸出*/intSearch(LinkListl,Elemtypee);//查找指定的元素voidDeletelist(LinkListl,Elemtypee);//刪除元素voidCount();//計(jì)數(shù)voidCREATE(LinkList*head);voidINSERT(LinkList*head);voidPRINT(LinkList*head);voidSEARCH(LinkList*head);voidDELET(LinkList*head);voidCOUNT();單鏈表操作函數(shù):#define_CRT_SECURE_NO_WARNINGS#include"linklist.h"voidmain_menu(){printf("\t單鏈表的簡單操作\t\t\n\n");printf("\t1單鏈表的建立\n");printf("\t2單鏈表的插入\n");printf("\t3單鏈表的輸出\n");printf("\t4單鏈表的查找\n");printf("\t5單鏈表的刪除\n");printf("\t6單鏈表的長度\n");printf("\t0退出\n");}voidCreatFromHead(LinkList*l)/*頭插法建立單鏈表*/{Node*s;intc=0;intflag=1;*l=(Node*)malloc(sizeof(Node));if(*l==NULL){printf("申請空間失?。?!\n");return;}(*l)->next=NULL;while(flag){scanf("%d",&c);if(c!=0){s=(Node*)malloc(sizeof(Node));if(s==NULL){printf("申請空間失?。。n");return;}s->data=c;s->next=(*l)->next;(*l)->next=s;count++;}elseflag=0;}}voidInsert(LinkListl)//單鏈表的插入{intinsert=0;Node*s=NULL;printf("請輸入需要插入的元素:");scanf("%d",&insert);s=(Node*)malloc(sizeof(Node));if(s==NULL){printf("申請空間失?。?!\n");return;}while(l->next!=NULL){l=l->next;}s->data=insert;s->next=l->next;l->next=s;count++;}voidPrint(LinkListl)/*單鏈表的遍歷*/{Node*p;p=l->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}intSearch(LinkListl,Elemtypee)//查找指定的元素{while((l!=NULL)&&(l->data!=e)){l=l->next;}if(l==NULL){return-1;//查找失敗}else{return1;//查找成功}}voidDeletelist(LinkListl,Elemtypee)//刪除節(jié)點(diǎn){Node*p,*r,*q;p=l->next;q=l;while(p!=NULL){if(p->data==e){r=p;p=r->next;q->next=p;count--;free(r);break;}else{q=p;/*保留前驅(qū)節(jié)點(diǎn)*/p=p->next;}}if(p==NULL){printf("刪除失敗,沒有找到相應(yīng)的元素\n");}}voidCount(){printf("單鏈表中一共有%d個(gè)元素\n",count);}voidCREATE(LinkList*head){printf("請建立單鏈表用“0”來結(jié)束輸入\n");CreatFromHead(head);printf("初始化后的單鏈表為:");Print(*head);}voidINSERT(LinkList*head){Insert(*head);printf("插入后的單鏈表為:");Print(*head);}voidPRINT(LinkList*head){printf("單鏈表的輸出為:");Print(*head);}voidSEARCH(LinkList*head){intsearch=0;intret=0;printf("請輸入需要查找的元素:");scanf("%d",&search);ret=Search(*head,search);if(1==ret){printf("查找成功\n");}else{printf("查找失敗\n");}}voidDELET(LinkList*head){intdelet=0;printf("請輸入需要?jiǎng)h除的元素:");scanf("%d",&delet);Deletelist(*head,delet);printf("刪除之后的單鏈表為:");Print(*head);}voidCOUNT(){Count();}主菜單函數(shù):#define_CRT_SECURE_NO_WARNINGS#include"linklist.h"intmain()/*主函數(shù)*/{test();return0;}voidtest()//測試函數(shù){intinput=1;Node*head=NULL;main_menu();while(input!=_EXIT){scanf("%d",&input);switch(input){case_CREATE:{CREATE(&head);//創(chuàng)建break;}case_INSERT:{INSERT(&head);//插入break;}case_PRINT:{PRINT(&head);//輸出break;}case_SEARCH:{SEARCH(&head);//查找break;}case_DELETE:{DELET(&head);//刪除break;}case_COUNT:{COUNT();//計(jì)數(shù)break;}case_EXIT:{exit(0);//退出break;}default:{break;}}main_menu();}free(head);}數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)學(xué)生信息管理系統(tǒng)C語言編寫僅供參考:#include<stdio.h>#include〈stdlib.h>#include<string.h>#include<conio.h>#defineLENsizeof(LN(yùn)ode)typedefstructLNode{//用于存放學(xué)生信息節(jié)點(diǎn) intstuNumber;chartelenum[50];?intage;?charchass[50];?chardeptName[50]; /*charzhuanYe[50]; charadress[50];*/ charname[20]; structLN(yùn)ode*next;}LNode,*Link;//****************創(chuàng)建鏈表結(jié)點(diǎn)**************************************************************************?LinkcreateLink(LinkL) {//初始化定義函數(shù),聲明變量 voidinserStu(LinkL,LinkElem);//定義插入函數(shù) intcount(LinkL);inttemp;?temp=count(L);?printf("節(jié)點(diǎn)個(gè)數(shù)為%d:\n”,temp); Linkp;??intnum=1,stuNumber; chartelenum[50]; ?charname[20]; intage;/*chardeptName[50];?charadress[50];charzhuanYe[50];*/? charchass[50];?//開始輸出學(xué)生信息? while(1)? { ?printf(”請輸入學(xué)生的信息:學(xué)號(hào),姓名,年齡,班級(jí),院系,專業(yè),家庭住址,電話號(hào)碼\n");?printf("學(xué)號(hào)輸入負(fù)數(shù)結(jié)束!\n”); ?printf(”請輸入學(xué)號(hào)%d:",num);scanf("%10d”,&stuNumber); ?if(stuNumber<0){break;}printf("請輸入姓名%d:",num);?getchar(); ?gets(name); printf("請輸入年齡%d:",num);scanf("%d",&age); printf("請輸入班級(jí)%d:”,num); getchar(); gets(chass); printf(”請輸入電話號(hào)碼:",num); getchar(); gets(telenum);/*printf(”請輸入院系%d:",num); ?getchar();??gets(deptName);*/if(stuNumber〉=0) ? ??{ ??p=(Link)malloc(LEN);?? ?p->stuNumber=stuNumber;? strcpy(p—>chass,chass);?? /*strcpy(p-〉deptName,deptName);*/ ? ?p->age=age;? ?strcpy(p->telenum,telenum); ?? strcpy(p->name,name);//插入新結(jié)點(diǎn) ? ?inserStu(L,p);num++;? ??} ?}??return(L);?}//******************打印頭結(jié)點(diǎn)為L的學(xué)生記錄********************************************************voidprintList(LinkL){ printf("\n*********************學(xué)號(hào),姓名,年齡,班級(jí),電話號(hào)碼**************************\n"); printf("\n學(xué)號(hào)姓名年齡專業(yè)班級(jí)電話號(hào)碼\n"); intn=1; Linkp=L; intcount(LinkL);inttemp; temp=count(L);//結(jié)點(diǎn)個(gè)數(shù): if(temp==0)printf("系統(tǒng)中沒有元素\n”);//判斷學(xué)生管理系統(tǒng)中有無信息else while(p—>next!=NULL)?{ ??printf(”%2d%-9d",n,p—>next—〉stuNumber); ?printf("%-8s%-5d%—12s%s\n”,p—>next—〉name,p—〉next—>age,p—>next->chass,p—>next->telenum/*p-〉next->deptName*/);//首個(gè)字符打印不出來? ?p=p-〉next; ?n++;??} printf("\n***********************************************************************************\n");?return;}//********************************插入學(xué)生信息**************************************voidinserStu(LinkL,LinkElem){Linkprior(LinkL,Linkp); Linkp=L->next;//*******%%%%****?while(p?。絅ULL&&Elem->stuNumber>=p—>stuNumber) {? if(p-〉stuNumber==Elem->stuNumber) { ?printf("重復(fù)輸入學(xué)號(hào),輸入失?。?);return;? } ?p=p—>next; }//確定Elem的插入位置 if(p==NULL) { p=prior(L,p);Elem->next=NULL;p-〉next=Elem;//若為空表,插入到頭結(jié)點(diǎn)之后} else { ?p=prior(L,p);Elem->next=p—>next;p—>next=Elem;?}}//***********************找到當(dāng)前地址元素的前一元素的地址*************************************************************************Linkprior(LinkL,Linkp)?{? if(L-〉next==NULL)return(L); Linkp_prior=L;?while(p_prior—>next!=p)?{ p_prior=p_prior->next; } return(p_prior);}//********************************8按學(xué)號(hào)查詢學(xué)生信息***************************************************************************intsearchName(LinkL,charn[]){ intflag=0;//標(biāo)志要查找的學(xué)生和學(xué)生記錄中的姓名是否匹配 Linkp=L—〉next;?intseat=1;if(L->next==NULL||L==NULL)printf("沒有學(xué)生信息\n");else { while(p!=NULL)? {? if(!strcmp(p->name,n))//比較要查找的姓名是否和當(dāng)前學(xué)生信息所指的姓名匹配 ? {? flag=1;//輸入姓名匹配 ??printf("要查找的是第%d位學(xué)生\n",seat);? printf(”學(xué)號(hào)是:%d名字:%s年齡:%d班級(jí):%s手機(jī)號(hào):%s\n",p->stuNumber,p—〉name,p—〉age,p—>chass,p->telenum); ??} p=p—〉next;seat(yī)++;??} } returnflag;}//****************************************按學(xué)號(hào)查找學(xué)生信息*********************************************************************intsearchNum(LinkL,intn){?intflag=0;//標(biāo)志要查找的學(xué)生和管理信息系統(tǒng)中的學(xué)號(hào)是否匹配?Linkp=L->next;?intseat=1; if(L->next==NULL)printf(”沒有學(xué)生信息\n”); else?{ ??while(p!=NULL)?? { ?if(p-〉stuNumber〈=n) ???{??? if(p—〉stuNumber==n)//比較要查找的學(xué)號(hào)是否和當(dāng)前學(xué)生信息所指的學(xué)號(hào)匹配? ?{ ???flag=1;//輸入學(xué)號(hào)匹配????printf("要查找的是第%d位學(xué)生\n”,seat(yī)); ? ?printf("學(xué)號(hào)是:%d名字:%s年齡:%d班級(jí):%s手機(jī)號(hào):%s\n",p—>stuNumber,p->name,p->age,p-〉chass,p—〉telenum);? } ?? }??p=p-〉next;seat++;???}?}returnflag;}//*******************************從通訊錄中刪除第i個(gè)元素***************************************************************************voiddeleteElem(LinkL,inti){?Linkp=L; intj=0; while(p-〉next&&j〈i-1) { p=p-〉next;j++; }?if(!(p—>next))//判斷i時(shí)候合法,i不能大于元素的個(gè)數(shù),也不能小于等于0 {??printf("第%d個(gè)學(xué)生刪除失敗\n”,i);?? return;?}?Linkq=p->next;?p->next=q—〉next; free(q);}//*******************按姓名刪除學(xué)生信息**********************************************************************************************intdeleName(LinkL,charn[]){voiddeteStu(Link);intflag=0;//判斷要?jiǎng)h除的學(xué)生與系統(tǒng)中的姓名是否匹配?Linkp=L->next;intseat=1;if(L->next==NULL){printf("\n刪除提示:系統(tǒng)中沒有元素,刪除失??!\n");deteStu(L);}else{while(p!=NULL)?{ ?if(!strcmp(p->name,n))//比較名字是否匹配? {??flag=1;??printf("%s”,p->name); p=p->next; ?deleteElem(L,seat);//刪除第i個(gè)學(xué)生的信息??} else? { p=p—>next;seat++;? } if(flag)printf("被刪除了\n”);?}}returnflag;}//*****************按學(xué)號(hào)刪除學(xué)生信息*****************************************************************intdeleNum(LinkL,intn){voiddeteStu(Link);??intflag=0; Linkp=L-〉next;??intseat=1;if(L—>next==NULL)? { printf("\n刪除提示:系統(tǒng)中沒有元素,刪除失敗!\n”);deteStu(L);??}?else ?{? while(p!=NULL)??{ if(p->stuNumber==n)? ??{ ?? flag=1;?? ?printf(”%d”,p—>stuNumber);? p=p-〉next; ? deleteElem(L,seat(yī));?? ?break; ???}? ?p=p—>next;? ?seat++; ?} ?if(flag){? ?printf("被刪除了\n");} ?else{???printf(”沒有找到學(xué)生信息\n"); ?} ?}?returnflag;}//*************************************************************************************voidsearchWay1(LinkL){voidsearchMenu(LinkL);intsearchWay=0;//控制跳出循環(huán),再次選擇查詢方式 ??if(searchWay==0)??? {??? printf(”請輸入要查詢的學(xué)生的學(xué)號(hào):\n"); ? ?intn,s;? ?? scanf(”%d",&n);? ? s=searchNum(L,n); ???if(s==0)printf(”查找失?。躰");???? searchWay=1;?? } ? if(searchWay==1)????{ ? ??searchMenu(L);? ?}}//********************************************************************************voidsearchWay2(LinkL){voidsearchMenu(LinkL); intsearchWay=0;//控制跳出循環(huán),再次選擇查詢方式 ? ? if(searchWay==0)? ?? { ? ? charn[20];intflag;? ?? printf("請輸入要查詢的學(xué)生姓名\n");? ? ??chartemp2=getchar(); ?? ?gets(n);????? flag=searchName(L,n);? ? ??if(flag==0)printf(”查找失敗!\n”); ???searchWay=1; ? }??? if(searchWay==1)? ? { ?? ?searchMenu(L); ? ??}}//*****************************************************************8voidsearchMenu(LinkL){ intmainMenu();printf(”**********************查詢菜單**************************************\n”);printf(”***1輸入學(xué)生學(xué)號(hào)查詢學(xué)生信息\n”);printf(”***2輸入學(xué)生姓名查詢學(xué)生信息\n");printf("***3返回上級(jí)菜單\n");printf("**********************查詢菜單**************************************\n");printf(”請選擇1-3:");intmenu;?scanf("%d”,&menu);switch(menu) {?case1:{searchWay1(L);break;}case2:{searchWay2(L);break;}?case3:{? break;//跳回主菜單程序???}?}}//************************************更新學(xué)生信息模塊*****************************************voidalterStu(LinkL)//按學(xué)號(hào)更新學(xué)生信息{intn;printf("請輸入要修改的學(xué)生學(xué)號(hào):"); scanf("%d”,&n); Linkp=L-〉next; if(p==NULL){printf("學(xué)生管理系統(tǒng)沒有學(xué)生信息?。?;} while(p?。剑蜺LL)//循環(huán)查找學(xué)生信息,如果找到該學(xué)號(hào)則進(jìn)入循環(huán)體更改學(xué)生信息 {//**********************************************************************************************? if(p—〉stuNumber==n){?? ? intnum=1,stuNumber,age; ? ??chartelenum[50]; ?charname[20]; ??? ?charchass[50];printf(”***********************更改學(xué)生信息*****************************************\n");??? printf("請輸入學(xué)生的學(xué)號(hào),姓名和電話號(hào)碼\n");printf(”請輸入學(xué)號(hào)%d:”,num);scanf(”%d",&stuNumber);printf("請輸入姓名%d:",num);getchar();gets(name); ? ?printf("請輸入年齡%d:",num);scanf("%d",&age); printf("請輸入班級(jí)%d:",num); ?getchar();?gets(chass);printf("請輸入電話號(hào)碼:",num);getchar();gets(telenum);p—〉age=age;p—>stuNumber=stuNumber;strcpy(p->telenum,telenum);strcpy(p—>name,name);???? strcpy(p—〉chass,chass); ?? //更新新結(jié)點(diǎn) printf(”***********************更改學(xué)生信息完畢*****************************************\n”);//************************************************************************************************* ? }?p=p->next;}}//****************保存學(xué)生信息模塊***************************************************************************voidkeepStu(LinkL){??Linkp=L—>next;??FILE*fp; if((fp=fopen("student。txt”,”r”))==NULL)//打開文件,不存在此文件則新建?{ fp=fopen("E:\\測試\\student.txt",”w”); fclose(fp);?}?fp=fopen(”E:\\測試\\student.txt","a"); while(p!=NULL) {?fprintf(fp,"%d\t%s\t%s\n",p->stuNumber,p-〉name,p-〉telenum);?p=p->next;?}?fclose(fp);?printf("文件保存成功!\n");}//********************統(tǒng)計(jì)結(jié)點(diǎn)個(gè)數(shù)模塊***********************************************************************************intcount(LinkL){ intn=0;?Linkp=L—〉next;?if(p==NULL){printf(”不存在學(xué)生信息\n");} while(p!=NULL)?{?p=p->next; ?n++; }returnn;}//********************************導(dǎo)入學(xué)生信息模塊**********************************************************************LinkstuEntry(){ FILE*fp;? Linkp,q,L; if((fp=fopen(”E:\\測試\\student。txt",”r”))==NULL)//打開文件,不存在此文件則新建 {?; }L=q=(Link)malloc(LEN);?printf("\n學(xué)號(hào)姓名手機(jī)號(hào)\n");?printf(”**********************************************************\n");while(?。鎒of(fp))?{p=(Link)malloc(LEN);?fscanf(fp,”%d\t%s\t%s\n",&p-〉stuNumber,&p—〉name,&p->telenum); printf("\n%d\t%s\t%s\n”,p—〉stuNumber,p—〉name,p->telenum);?q->next=p;?q=p; } q->next=NULL;?fclose(fp); printf(”按任意鍵結(jié)束:”); getch();//返回returnL;}//********************添加學(xué)生信息**************************************************************************voidAddStu(LinkL){inttemp; temp=count(L); printf("節(jié)點(diǎn)個(gè)數(shù)為%d:\n",temp);? ???if(temp==0){createLink(L);}//如果沒有學(xué)生信息則調(diào)用初始化函數(shù)?createLink(L);}//****************?jiǎng)h除學(xué)生菜單****************************************************voiddeteStu(LinkL){intflag=0,way,n; ??printf("\n************************?jiǎng)h除菜單********************\n”); ??printf("\n選擇操作方式*************1:按學(xué)號(hào)********************\n"); ? printf("*************2:按姓名********************\n"); printf(”*************3:返回主菜單*********************\n”); ? ?printf("\n請輸入刪除方式:");??? ?scanf("%d",&way); ?? if(way〈1||way>3){deteStu(L);} ??switch(way) {? ??case1: { ? ? printf(”請輸入要?jiǎng)h除的學(xué)生學(xué)號(hào):");scanf("%d",&n); ? ? flag=deleNum(L,n);break;?????? }? ??case2:{ ? ??charn[20]; printf(”請輸入要?jiǎng)h除的學(xué)生姓名:"); ???chartemp1=getchar();gets(n);? ?flag=deleName(L,n);break;??? ??}? ? case3:{break;}} ???if(flag) ? ? {?? ?printf("刪除成功!\n");deteStu(L);?? ? }}//**********************主菜單程序******************************************************************************intmainMenu(){printf(”\n****************************?dú)g迎使用學(xué)生管理信息系統(tǒng)***********************************************\n");printf(”****1輸入學(xué)生信息*****\n");printf("****2顯示學(xué)生信息*****\n”);printf("****3查詢學(xué)生信息*****\n”);printf("****4更新學(xué)生信息*****\n");printf(”****5添加學(xué)生信息*****\n”);printf("****6刪除學(xué)生信息*****\n”);printf(”****7保存學(xué)生信息*****\n");printf("****8從文件導(dǎo)入學(xué)生信息*****\n");printf("****0退出管理信息系統(tǒng)*****\n");printf("****************************?dú)g迎使用學(xué)生管理信息系統(tǒng)***********************************************");?intmenu=0; printf("請選擇0-8:”);?scanf(”%d",&menu);if(menu〈0&&menu〉8) {printf("輸入無效,請正確輸入有效序號(hào)0-8:");scanf("%d",&menu);?}?returnmenu;???}//**************************main()程序*****************************************************************************************************voidmain(){LinkL=(Link)malloc(LEN);//在主函數(shù)上首先讓結(jié)構(gòu)體指針初始化; L-〉next=NULL; intflag=0;//學(xué)生信息是否建立 intmenu=0;//菜單選項(xiàng)?do{menu=mainMenu();switch(menu)//用于調(diào)用子菜單 ?{??case1:{L=createLink(L);break;}??case2:{printList(L);break;} case3:{searchMenu(L);break;} case4:{alterStu(L);break;} case5:{createLink(L);break;}??case6:{deteStu(L);break;} case7:{kee(cuò)pStu(L);break;} ?case8:{L=stuEntry();break;} ?case0:{return;}? } }while(1);}//******************************************************************************************************************************數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-順序表的創(chuàng)建、遍歷及有序合并操作二、實(shí)驗(yàn)內(nèi)容與步驟實(shí)現(xiàn)順序表的創(chuàng)建、遍歷及有序合并操作,基本數(shù)據(jù)結(jié)構(gòu)定義如下:typedefintElemType;#defineMAXSIZE100#defineFALSE0#defineTRUE1typedefstruct{ElemTypedata[MAXSIZE];intlength;}seqlist;創(chuàng)建順序表,遍歷順序表#include<stdio.h>#include<stdlib.h>#defineMAXSIZE100#defineIcreament20#defineFALSE0#defineTRUE1typedefintElemType;//用戶自定義數(shù)據(jù)元素類型//順序表結(jié)構(gòu)體的定義typedefstruct{ElemType*elem;//順序表的基地址intlength;//順序表的當(dāng)前長度intlistsize;//預(yù)設(shè)空間容量}SqList;//線性表的順序存儲(chǔ)結(jié)構(gòu)SqList*InitList()//創(chuàng)建空的順序表{SqList*L=(SqList*)malloc(sizeof(SqList));//定義順序表Lif(!L){printf("空間劃分失敗,程序退出\n");returnNULL;}L->elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));if(!L->elem){printf("空間劃分失敗,程序退出\n");returnNULL;}L->length=0;L->listsize=MAXSIZE;returnL;}intCreateList(SqList*L)//創(chuàng)建順序表(非空){intnumber;//順序表中元素的個(gè)數(shù)inti;//循環(huán)變量printf("請輸入順序表中元素的個(gè)數(shù):");scanf("%d",&number);if(number>MAXSIZE)//一定要判斷輸入的個(gè)數(shù)是否大于順序表的最大長度{printf("輸入個(gè)數(shù)大于順序表的長度\n");return0;}for(i=0;i<number;i++){printf("輸入第%d個(gè)數(shù):",i+1);scanf("%d",L->elem+i);//L->elem+i:每次的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年商用保溫售飯臺(tái)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年廚房噪音與振動(dòng)控制機(jī)器人行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2025-2030年手工刺繡藝術(shù)品店行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2025-2030年文件裝訂器行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 電動(dòng)自動(dòng)濾水器行業(yè)深度研究報(bào)告
- 2025年中國冷卷彈簧行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 2025年塔式起重起行業(yè)深度研究分析報(bào)告
- 2025年度綠色環(huán)保施工監(jiān)理服務(wù)合同
- 二零二五年度綠色環(huán)保涂料銷售代理協(xié)議
- 2025年度智慧城市建設(shè)項(xiàng)目政府計(jì)算機(jī)采購合同
- 駱駝祥子 故事情節(jié)
- 馬克思主義宗教觀課件
- 語文版九年級(jí)下冊課外閱讀練習(xí)
- 【課件】第11課+美術(shù)的曙光-史前與早期文明的美術(shù)+課件高中美術(shù)人教版(2019)美術(shù)鑒賞
- 高中化學(xué)人教版一輪復(fù)習(xí)-晶體結(jié)構(gòu)與性質(zhì)(復(fù)習(xí)課件)
- GB/T 22919.3-2008水產(chǎn)配合飼料第3部分:鱸魚配合飼料
- 船舶涂裝課件
- 【薪酬】國有企業(yè)中長期股權(quán)激勵(lì)課件
- 《新聞攝影教程(第五版)》第三章 新聞攝影工作者的職責(zé)與素養(yǎng)
- 學(xué)前兒童行為觀察第一章觀察概述課件
- 化學(xué)品防范說明編碼
評(píng)論
0/150
提交評(píng)論