用結構體實現連結串列的建立、遍歷、結點插入、結點刪除、連結串列刪除-----帶選單選項
#include <iostream> using namespace std; enum operation{create_List=1,print_List,insert_Node,delete_Node,delete_List,quit};//列舉型別,用於選單選擇結果 struct node //結點結構 { int data ; node * next; }; operation Menu(); //選單函式 node * CreateList( ); //建立連結串列函式宣告 void PrintList( node *); //輸出連結串列中結點資訊函式宣告 node * InsertNode(node *,node *); //在連結串列中插入結點函式宣告 node * DeleteNode(node *,int); //在連結串列中刪除結點函式宣告 node * deleteList(node *head); //刪除整個連結串列 void Create(); //對應操作選單--建立連結串列的操作 void Print( ); //對應操作選單--遍歷連結串列的操作 void Insert( ); //對應操作選單--插入連結串列結點的操作 void Delete( ); //對應操作選單--刪除連結串列結點的操作 void DeleteAll(); //對應操作選單--刪除整個連結串列的操作 int n=0; //全域性整型變數存放連結串列中結點個數 node * head=NULL ; //全域性指標變數存放連結串列頭結點地址-頭指標 int main() { operation menu_choice; //存放選單選擇項 do //迴圈現實直到使用者退出程式 { menu_choice=Menu(); //選單顯示及使用者選擇 switch(menu_choice) //使用者選擇功能匹配 { case create_List: cout<<"1 建立連結串列"<<endl<<endl; Create( ); break; case print_List: cout<<"2 遍歷連結串列"<<endl<<endl; Print(); break; case insert_Node: cout<<"3 插入連結串列結點"<<endl<<endl; Insert(); break; case delete_Node: cout<<"4 刪除連結串列結點"<<endl<<endl; Delete(); break; case delete_List: cout<<"5 刪除整個連結串列"<<endl<<endl; DeleteAll(); break; case quit : default: cout<<"退出連結串列操作,結束程式"<<endl; return 0; } }while(menu_choice!=quit); return 0; } /*建立連結串列*/ node * CreateList( ) //建立連結串列函式 { node * s, * p ; // s指向新結點,p指向連結串列中最後的結點 s = new node ; //動態建立第一個新結點 cout<<"請輸入一個整數值作為新結點的資料資訊,輸入0時建立連結串列結束"<<endl; cout<<"第"<<n+1<<"個結點"<<endl; cin >> s->data ; //輸入新結點資料 head = NULL ; //頭指標初始值為NULL if( s->data==0) //第一個結點資料就為0,建立一個空連結串列 { cout<<"您建立的空連結串列"<<endl; delete s ; //釋放資料為0的結點 } else //建立非空連結串列 { while ( s->data != 0 ) //通過判斷新結點資料來進行迴圈 { if ( head == NULL ) head = s ; //頭指標賦值 else p->next = s ; //將新結點插入已有連結串列的最後 p = s ; // p指向連結串列中最後的結點 n=n+1;//結點個數增1 s = new node ; //動態建立一個新結點 cout<<"請輸入一個整數值作為新結點的資料資訊,輸入0時建立連結串列結束"<<endl; cout<<"第"<<n+1<<"個結點"<<endl; cin >> s->data ; //輸入新結點資料 } p -> next = NULL ; //設定連結串列尾部為空 delete s ; //釋放資料為0的結點 cout<<endl<<"連結串列建立完成..."; cout<<"建立的連結串列中共有"<<n<<"個節點"<<endl<<endl; } return ( head ) ; //返回頭指標 } /*遍歷連結串列*/ void PrintList( node * head) //輸出連結串列中結點資訊函式,連結串列遍歷 { node *p=head; int i=1; cout<<endl<<"遍歷連結串列..."<<endl; if (head!=NULL) //如果連結串列非空,即連結串列中有結點 do //迴圈輸出接點資料,直到移動到連結串列尾,即最後一個結點 { cout<<"第"<<i++<<"個結點資料為:"<<p->data<<endl; p=p->next; }while(p!=NULL) ; else { cout<<"連結串列是空連結串列!"<<endl; } cout<<"連結串列中共有"<<n<<"個節點"<<endl; } /*插入結點*/ node * InsertNode(node *head,node * s) //插入結點的函式,head為連結串列頭指標,s指向要插入的新結點 {node *p,*q; p=head; //使p指向連結串列中的第一個結點 if(head==NULL) //原來的連結串列是空表 { head=s; //使head指向的新結點作為頭結點 s->next=NULL; } else //原來的連結串列不是空表 {while((s->data>p->data) && (p->next!=NULL)) //用迴圈定位要插入的結點位置p,使s插入到p之前的位置 {q=p; //q記錄下當前的p,即q指向p的前一個結點 p=p->next; //p後移一個結點 } if(s->data<=p->data) //要插入的結點資料比最後一個結點資料小 { if(head==p) //判斷是否插入連結串列中的第一個結點之前 { head=s; //插到原來第一個結點之前 s->next=p; } else //插到q指向的結點之後,p指向的結點之前 { q->next=s; s->next=p; } } else //要插入的結點資料比最後一個結點資料還大 { p->next=s; // 插到連結串列最後的結點之後,作為連結串列的尾結點 s->next=NULL; } } n=n+1; //結點數加1 cout<<"成功完成一個新結點插入..."<<endl; return (head); } /*刪除結點*/ node *DeleteNode(node *head,int delData) //刪除資料為delDate的結點的函式 {node *p,*q; p=head; //使p指向第一個結點 if (head==NULL) //是空表 { cout<<"該連結串列是空連結串列,不能進行結點刪除!"<<endl; return(head); } //先找到要刪除的結點 while(delData!=p->data && p->next!=NULL) //p指向的不是所要找的結點且後面還有結點 { q=p; //q用來記錄p前一個結點 p=p->next; } //p後移一個結點 if(delData==p->data) //找到了要刪除的結點 { if(p==head) //如果要刪除的是頭結點 head=p->next; //若p指向的是首結點,把第二個結點地址賦予head else q->next=p->next; //否則將下一結點地址賦給前一結點地址 cout<<"成功刪除資料為"<<delData<<"的結點"<<endl; n=n-1; } else cout<<"要刪除的資料為"<<delData<<"的結點在連結串列中沒有找到"<<endl; //找不到該結點 return(head); } /*刪除整個連結串列*/ node * deleteList(node *head) //刪除整個連結串列 { node *p,*s; p=head; if(head==NULL) cout<<"連結串列本身就為空連結串列"; else { while(p->next!=NULL) { s=p; p=p->next; delete s; n--; } delete p; n--; head=NULL; } cout<<"整個連結串列刪除成功!"<<endl; return head; } /*選單函式*/ operation Menu() { int choice; cout<<endl<<endl; cout<<"連結串列操作選單"<<endl; cout<<"1 建立連結串列"<<endl; cout<<"2 遍歷連結串列"<<endl; cout<<"3 插入連結串列結點"<<endl; cout<<"4 刪除連結串列結點"<<endl; cout<<"5 刪除整個連結串列"<<endl; cout<<"6 退出"<<endl; cout<<endl<<endl<<"請輸入功能序號"; cin>>choice; return operation(choice); } /*對應操作選單--建立連結串列的操作*/ void Create() { if(head==NULL) //如果連結串列中已有結點,不允許重新建立 { head=CreateList( ); } else { cout<<"已建立過連結串列,不允許再次建立"<<endl; cout<<"如果想重新建立,先刪除原先連結串列"<<endl; } } /*對應操作選單--遍歷連結串列的操作*/ void Print( ) { PrintList(head); } /*對應操作選單--插入連結串列結點的操作*/ void Insert( ) { char IsGo; //是否繼續操作標誌 IsGo='y'; cout<<endl<<"開始進行結點插入操作"<<endl; node *stu; while(IsGo=='y'||IsGo=='Y') { stu=new node; //建立要插入的新結點 cout<<endl<<"輸入要插入的新結點資料:"; cin>>stu->data; //輸入要插入的新結點資料 head=InsertNode(head,stu); //呼叫插入函式,返回連結串列頭指標 cout<<"是否繼續插入新結點? (繼續插入請按y或Y,退出請按其它鍵)"; cin>>IsGo; } cout<<endl<<"結點插入操作結束"<<endl; } /*對應操作選單--刪除連結串列結點的操作*/ void Delete( ) { char IsGo; //是否繼續操作標誌 int del_num; //要刪除的結點的資料 IsGo='y'; cout<<endl<<"開始進行結點插入操作"<<endl; while(IsGo=='y'||IsGo=='Y') { cout<<endl<<"輸入要刪除的節點的資料:"; //輸入要插入的結點 cin>>del_num; //輸入要刪除的結點的資料 head=DeleteNode(head,del_num); //刪除後連結串列的頭地址 cout<<"是否繼續刪除結點? (繼續插入請按y或Y,退出請按其它鍵)"; cin>>IsGo; } cout<<endl<<"結點刪除操作結束"<<endl; } /*對應操作選單--刪除整個連結串列的操作*/ void DeleteAll() { head=deleteList(head); }
相關推薦
用結構體實現連結串列的建立、遍歷、結點插入、結點刪除、連結串列刪除-----帶選單選項
#include <iostream> using namespace std; enum operation{create_List=1,print_List,insert_Node,delete_Node,delete_List,quit};//列舉型別,
用結構體實現棧出現段錯誤
weibo mmd dto MQ TP com 段錯誤 結構體 http b7rd1fvs3p匚緣廖韻陀甘緣吹醬料《http://weibo.com/p/230927987517309797011456》 gxtglkxvpk對蛻穆釁叵墳億斯拾慕《http://weibo
(1)順序表的操作 ① 輸入一組整型元素序列,建立線性表的順序儲存結構。 ② 實現該線性表的遍歷。 ③ 在該順序表中查詢某一元素,查詢成功顯示查詢元素,否則顯示查詢失敗。 ④ 在該順序表中刪除或插入指
(1)順序表的操作 ① 輸入一組整型元素序列,建立線性表的順序儲存結構。 ② 實現該線性表的遍歷。 ③ 在該順序表中查詢某一元素,查詢成功顯示查詢元素,否則顯示查詢失敗。 ④ 在該順序表中刪除或插入指定元素。 ⑤ 建立兩個按值遞增有序的順序表,將他們合併成一個按值遞增有序的
JS實現圖的建立和遍歷
圖分為無向圖和有向圖 圖的儲存結構有鄰接矩陣、鄰接表、十字連結串列、鄰接多重表這四種,最常用的是前兩種 本篇主要是利用鄰接矩陣實現無向圖的建立和遍歷(深度優先、廣度優先),深度優先其實就是二叉樹裡的前序遍歷 利用鄰接
資料結構——二叉樹的建立和遍歷(遞迴建樹&層序遍歷建樹)
資料結構作業模板存檔 #include<stdio.h> #include <cstdlib> #include <iostream> #include <stack> #include<queue&g
基本資料結構——二叉樹的建立,遍歷,求葉子節點,深度計算
/* 新建立一棵二叉樹,遍歷,查詢樹的高度,查詢樹的葉子節點,和總結點數 然後再計算距離最遠的兩個節點。 SQ 2014-04-20 */ #include<stdio.h> struct Node{ int data; struct Node
用java程式碼實現二叉樹的遍歷演算法
二叉樹的遍歷可以採用遞迴演算法來實現,遍歷方式有三種:先序遍歷,中序遍歷,後序遍歷。 下面是一個例子: public class BinTree{
c學習筆記--5 結構體實現動態連結串列
這裡不得不多說一句,對於c來說指標我認為最好用的就是連結串列,有很多實用的地方 #include<string.h> #include<stdio.h> //C語言 連結串列篇 //結構體實現單向連結串列 struct MyStruc
用結構體指標做函式形參實現返回多個值(fishing_6)
最近在學ST32驅動數字攝像頭OV2640的實驗,無意中遇到了函式返回多個值的情況,決定Mark一下,說不定以後就會用到,因為一般函式都是隻有一個返回值的嘛,具體如下: 首先在標頭檔案定義結構體: typed
連結串列的建立、插入、刪除、逆序、遍歷
#include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; typedef struct node{ int data; struct node * next
(C語言)連結串列的建立、遍歷、插入和刪除
作者:翁鬆秀 (C語言)連結串列的建立、遍歷、插入和刪除 (C語言)連結串列的建立、遍歷、插入和刪除 連結串列結構定義
利用頭插法——建立、插入、遍歷連結串列
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h> 4 typedef struct student 5 { 6 int num; 7 float socre;
資料結構學習二 資料結構之連結串列圖解版【建立,遍歷,刪除,插入】
圖解連結串列: ● 建立動態連結串列 待插入的結點p1資料部分初始化,該結點被頭結點head、尾結點p2同時指向 1.任務是開闢結點和輸入資料 2.並建立前後相鏈的關係 p1重複申請待插入結點空間,對該結點的資料部分賦值(或輸入值) P2->
用C語言分配動態二維陣列(結構體實現)
#include<stdio.h> #include<stdlib.h> typedef struct { double **mat; int m; int n; }Matrix; void InitialMatrix(Matrix *T,in
資料結構 線性連結串列的創立及其基本操作初始化、遍歷、銷燬、判空、求表長、刪除、插入等
最近寫了個數據結構的單鏈表,其中包括十來個基本操作演算法,包括了建立單鏈表、刪除、插入、定位、遍歷等基本的操作。在VS上運行了一下,可以通過,感覺還不錯,和大家分享一下! 我是建立了一個C++專案,在專案下寫的,你們也可以建立專案把下面的東西複製到編譯器上試試! 第一部分是
《資料結構與演算法》第一次實驗內容•線性表的建立、銷燬、插入、刪除、遍歷等操作的實現
《資料結構與演算法》第一次課內容安排 線性表的建立、銷燬、插入、刪除、遍歷等操作的實現 實驗目的: 1、通過實驗掌握、複習C++有關基本知識; 2、通過實驗熟練掌握在連結串列結構中實現線性表操作的方法,並實現基本操作:查詢、插入和刪除等演算法。 實驗內容: 一、連
用C++結構體實現順序表的諸多功能
hnu type 結構體 clu 刪除 ace break 輸入數據 環境 編譯運行環境為visual studio 2017 for community #include <iostream> #include<stdlib.h> #defi
用結構體指針存儲數據__正序_逆序下的輸入
scan point 內存 initial return pri tdi log 位置 逆序輸入 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h>
日常學習隨筆-用鏈表的形式實現普通二叉樹的新增、查找、遍歷(前、中、後序)等基礎功能(側重源碼+說明)
新增 rabl super 例子 信息 count TP title 處理 一、二叉樹 1、二叉樹的概念 二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree),其次序不能任意顛倒。 2、性質
【資料結構週週練】016 利用遞迴演算法及孩子兄弟表示法建立樹、遍歷樹並求樹的深度
一、前言 從今天起,就給大家分享一些樹的程式碼啦,不僅僅是二叉樹,我們要弄明白,普通的樹用資料結構怎麼儲存,它有哪些操作,它可以實現哪些功能? 可能大家要問了,二叉樹不是還沒有寫完嗎,線索二叉樹呢?二叉排序樹呢?平衡二叉樹呢?大家不要急,我們通過二叉樹來入門樹的演算法及程式碼實現,然後學