1. 程式人生 > >用結構體實現連結串列的建立、遍歷、結點插入、結點刪除、連結串列刪除-----帶選單選項

用結構體實現連結串列的建立、遍歷、結點插入、結點刪除、連結串列刪除-----帶選單選項

#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 利用遞迴演算法及孩子兄弟表示法建立樹並求樹的深度

一、前言 從今天起,就給大家分享一些樹的程式碼啦,不僅僅是二叉樹,我們要弄明白,普通的樹用資料結構怎麼儲存,它有哪些操作,它可以實現哪些功能? 可能大家要問了,二叉樹不是還沒有寫完嗎,線索二叉樹呢?二叉排序樹呢?平衡二叉樹呢?大家不要急,我們通過二叉樹來入門樹的演算法及程式碼實現,然後學