1. 程式人生 > >資料結構之—線性表之—淺談單鏈表有頭結點和無頭節點

資料結構之—線性表之—淺談單鏈表有頭結點和無頭節點

有頭結點的連結串列統一了演算法的實現,無頭節點減少了節點個數,但是隻有根據實際情況選用真正的有無頭節點連結串列

待續://程式碼實現

待續://程式碼實現

待續://程式碼實現

/**********************************************************************   
* Copyright (c)2015,WK Studios 
* Filename:  Node.h
* Compiler: GCC,VS,VC6.0  win32   
* Author:WK   
* Time: 2015 26 4 
************************************************************************/  

#ifndef _NODE_H_
#define _NODE_H_
#include<iostream>
using namespace std;

#define ElemType int
typedef struct Node
{
   ElemType data;
   struct Node *next;

}Node,*Node_List;
//1.頭插法初始化無頭結點連結串列(改變節點資料或者指標必須給函式傳入該變數的地址)
void Init_Node_List_No_HeadInsert(Node **head);//Init_Node_List(Node *&L)或者Init_Node_List(Node_List &L)
//2.尾插法初始化無頭結點連結串列(改變節點資料或者指標必須給函式傳入該變數的地址)
void Init_Node_List_No_BackInsert(Node **head);//Init_Node_List(Node *&L)或者Init_Node_List(Node_List &L)
//3.1顯示有有結點連結串列資料
void Show_Node_List_HaHead(Node *L);//無需改變指標L所以值傳遞
//3.2顯示有無結點連結串列資料
void Show_Node_List_NoHead(Node_List L);//無需改變指標L所以值傳遞
//4.尾插法初始化有頭結點連結串列
void Init_Node_List_Have_BackInsert(Node **head); //對於有頭節點的頭節點所指向的位置不變可以用
//5.頭插法初始化有頭結點連結串列
void Init_Node_List_Have_HeadInsert(Node **head);
#endif

/**********************************************************************   
* Copyright (c)2015,WK Studios 
* Filename: Node.cpp 
* Compiler: GCC,VS,VC6.0  win32   
* Author:WK   
* Time: 2015 26 4 
************************************************************************/  
#include"Node.h"
//1.頭插法初始化無頭結點連結串列
void Init_Node_List_No_HeadInsert(Node **head)//Init_Node_List(Node *&L)或者Init_Node_List(Node_List &L)
{
	Node *p,*t;         //t工作指標,p臨時指標*/
	int i=1,a;
	cout<<"please input datas (end of -1):";
	while(cin>>a,a!=-1)//	while(scanf("%d",&a))
	{    if(a)
	{
		t=(Node *)malloc(sizeof(Node));//建立第一個節點
               if(!t)
                   {
                    cout<<"申請記憶體失敗\n";
                    exit(0);
                     }
                t->data=a;
		
		if(i==1)
		{
			t->next=NULL;//第一個節點指標置空,其實就是最後一個節點
		}
		else
		{
			
			t->next=p;
		}
		p=t;
	}
	i++;//記錄節點數
	}
	if(i==1)//如果沒有輸入節點資料並且輸入-1結束
	{
		exit(0);
	}
	*head=t;//頭指標指向最前面的節點
	
}   
//2.尾插法初始化無頭結點連結串列
void Init_Node_List_No_BackInsert(Node **head)//Init_Node_List(Node *&L)或者Init_Node_List(Node_List &L)
{
	Node *p,*t;  //t工作指標,p臨時指標
	int i=1,a;
	cout<<"please input datas (end of -1):";
	while(cin>>a,a!=-1)//	while(scanf("%d",&a))
	{    if(a)
	{
		t=(Node *)malloc(sizeof(Node));//建立第一個節點
		
               if(!t)
                   {
                    cout<<"申請記憶體失敗\n";
                    exit(0);
                     }
               t->data=a;
		if(i==1)
		{
			*head=t;//將頭節點指向第一個節點
		}
		else
		{
			p->next=t;
		}
		p=t;//p指向建立的節點t
	}
	i++;//記錄節點數
	}
	if(i==1)//如果沒有輸入節點資料並且輸入-1結束
	{
		exit(0);
	}
	p->next=NULL;//將最後一個節點的指標域置空
	
}
//3.1 顯示有頭結點連結串列資料
void Show_Node_List_HaHead(Node_List L)//無需改變指標L所以值傳遞
{
	cout<<"連結串列節點:";
	while(L->next!=NULL)
	{
		
		cout<<L->next->data;
		if(L->next->next!=NULL)
		{
			cout<<"->";
		}
		L=L->next;
		
	}
	cout<<"\n";
}
//3.2顯示無頭結點連結串列資料
void Show_Node_List_NoHead(Node_List L)//無需改變指標L所以值傳遞
{
	cout<<"連結串列節點:";
	while(L!=NULL)
	{
		
		cout<<L->data;
		if(L->next!=NULL)
		{
			cout<<"->";
		}
		L=L->next;
		
	}
	cout<<"\n";
}
//4.尾插法初始化有頭結點連結串列
void Init_Node_List_Have_BackInsert(Node **head)
{    Node *s;
    Node *r=*head=(Node*)malloc(sizeof(Node));
	        if(!r)
                   {
                    cout<<"申請記憶體失敗\n";
                    exit(0);
                     }
        (*head)->data=NULL;
	    (*head)->next=NULL;
	int a,i=1;
	cout<<"please input datas (end of -1):";
     while(cin>>a,a!=-1){
          if(a){
               s=(Node *)malloc(sizeof(Node));
              
               if(!s)
                   {
                    cout<<"申請記憶體失敗\n";
                    exit(0);
                     }
               s->data=a;
               r->next=s;
               r=s;    
          }
		  i++;
         } 
	 if(i==1)//如果沒有輸入節點資料並且輸入-1結束
	{
		exit(0);
	}
	 r->next=NULL;
}
//5.頭插法初始化有頭結點連結串列
void Init_Node_List_Have_HeadInsert(Node **head)
{
    Node *s;
    Node *r=*head=(Node*)malloc(sizeof(Node));
	(*head)->data=NULL;
	(*head)->next=NULL;
int a,i=1;
	cout<<"please input datas (end of -1):";
     while(cin>>a,a!=-1){
          if(a){
               s=(Node *)malloc(sizeof(Node));
               s->data=a; 
			  s->next=r->next;
			   r->next=s;
			   if(i==1)
			   {
			   s->next=NULL;
			   } 
			  
          }
      i++;
         } 
	 if(i==1)//如果沒有輸入節點資料並且輸入-1結束
	{
		exit(0);
	}
	 
}

/**********************************************************************   
* Copyright (c)2015,WK Studios 
* Filename:  main.cpp 
* Compiler: GCC,VS,VC6.0  win32   
* Author:WK   
* Time: 2015 26 4 
************************************************************************/  
#include"Node.h"
int main()
{
	Node_List myNode;
	int select=1;
	while(select)
	{
		cout<<"***********************************************\n";
		cout<<"*      [1] Init_Node_List_No_HeadInsert       *\n";
		cout<<"*      [2] Init_Node_List_No_BackInsert       *\n";
		cout<<"*      [3] Init_Node_List_Have_HeadInsert     *\n";
		cout<<"*      [4] Init_Node_List_Have_BackInsert     *\n";
		cout<<"*      [5] Show_Node_List_HaHead              *\n";
		cout<<"*      [6] Show_Node_List_NoHead              *\n";
		cout<<"*      [0] Quit                               *\n";
		cout<<"***********************************************\n";
	cout<<"Please select a number which represent you want to operate:>"; 
	cin>>select;
	switch(select)
	{
	case 1:
	Init_Node_List_No_HeadInsert(&myNode);//如果用的是Init_Node_List(Node **L)必須Init_Node_List(&myNode);
    break;
	case 2:
		Init_Node_List_No_BackInsert(&myNode);
	break;
	case 3:
		Init_Node_List_Have_HeadInsert(&myNode);
		break;
   case 4:
		Init_Node_List_Have_BackInsert(&myNode);
		break;
	case 5:
		Show_Node_List_HaHead(myNode);
		break;
	case 6:
		Show_Node_List_NoHead(myNode);
		break;
	default :
		cout<<"Thanks for  using!\n";
		break;
	}
	}
return 0;
}


相關推薦

資料結構線性單鏈結點無頭節點

有頭結點的連結串列統一了演算法的實現,無頭節點減少了節點個數,但是隻有根據實際情況選用真正的有無頭節點連結串列 待續://程式碼實現 待續://程式碼實現 待續://程式碼實現 /*****************************************

關於結點無頭結點單鏈

target csv fcgi targe user ref ocs doc 單鏈表 p88X17曰潦侔1騁VLhttp://www.docin.com/app/user/userinfo?userid=179117005 鍁斷579吵4龐QGhttp://www.doc

分別用插法尾插法建立結點無頭結點單鏈

1、頭插法建立無頭結點的連結串列 連結串列無頭結點,則在建立連結串列的時候,使頭指標L=NULL; 用頭插法插入元素的時候,首先要判斷頭指標是否為空; 如果頭指標為空,則將新插入的結點賦值給頭指標,即L=p;然後將新結點的頭指標指向NULL; 如果頭指標不為空,則將新結點指

資料結構中的各種樹

資料結構中為了儲存和查詢的方便,用各種樹結構來儲存檔案,本章就淺談一下各種樹的表示方法、特點及各自的用途,本章設計的樹結構包括:二叉查詢樹(二叉排序樹)、平衡二叉樹(AVL樹)、紅黑樹、B-樹、B+樹、字典樹(trie樹)、字尾樹、廣義字尾樹。 1、二叉查詢樹(二叉排序

[PTA] 資料結構與演算法題目集 6-1 單鏈逆轉

List Reverse(List L) { List p, q; p = L; q = L; L = NULL; while (p) { p = p->Next; q->Next = L; L = q

資料結構導論-2.3 其他運算在單鏈上的實現

一、尾插法建表1 演算法思路:每次在連結串列的尾部增加新的結點. 設資料元素的型別為int,利用InsertLinkList(LinkList head, int x, int i)來實現,依次增大插入位置,使新的結點鏈入到連結串列中。 演算法實現: LinkList

資料結構與演算法』連結串列(單鏈、雙鏈、環形連結串列)

> 微信搜尋:碼農StayUp > 主頁地址:[https://gozhuyinglong.github.io](https://gozhuyinglong.github.io/) > 原始碼分享:[https://github.com/gozhuyinglong/blog-demos](h

資料結構3----線性中鏈式結構的其他幾種實現(霜小刀)

歡迎轉載和引用,若有問題請聯絡 若有問題,請聯絡 Email : [email protected] QQ:2279557541 前言   鏈式結構除了上一篇結構中所講的單項鍊表外, 還有另外幾種。按照<大話資料結構>中所說 包括

【Java】 大話資料結構(1) 線性順序儲存結構

 本文根據《大話資料結構》一書,實現了Java版的順序儲存結構。 順序儲存結構指的是用一段地址連續的儲存單元一次儲存線性表的資料元素,一般用一維陣列來實現。 書中的線性表抽象資料型別定義如下(第45頁): 實現程式:

1、【資料結構線性結構單鏈

單向連結串列 一、定義:     單向連結串列(單鏈表)時連結串列的一種,它由節點組成,每個節點都包含下一個節點的指標。     單鏈表的特點是:節點的連結方向是單向的;相對於陣列來說,單鏈表的的隨機訪問速度較慢,但是單鏈表刪除/新增資料的效率很高。 二、實現:

資料結構與演算法》集合一(線性

資料結構=資料+結構,是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。 Java集合框架主要包括兩種型別的容器,一種是集合(Collection),儲存一個元素集

資料結構一一線性的鏈式儲存結構插入與遍歷

#include <iostream> #include <stdio.h> #include <time.h> #include <malloc.h> #define ERROR 0 #define OK 1 typedef int Status;/*

資料結構(一)順序與連結串列

順序表 運用陣列結構來構建的線性表就是順序表。 本例實現了順序表的列印、清空、判斷是否為空、求表長、獲得指定下標的元素、獲得指定元素的下標、插入和刪除操作。 #include<iostream> const int MAXSIZE=100; using

資料結構與演算法】單鏈、雙鏈、迴圈連結串列的基本介紹及其Java程式碼實現---第三篇

一、連結串列的基本介紹 連結串列的定義:連結串列是一種遞迴的資料結構,它或者為空(null),或者是指向一個結點(node)的引用,該結點含有一個泛型的元素和一個指向另一條連結串列的引用。----Algorithms  Fourth  Edition   常見的連結串

資料結構自建演算法庫——迴圈單鏈

按照“0207將演算法變程式”[視訊]部分建議的方法,建設自己的專業基礎設施演算法庫。 雙鏈表演算法庫演算法庫採用程式的多檔案組織形式,包括兩個檔案:      1.標頭檔案:clinklist.h,包含定義雙鏈表資料結構的程式碼、巨集定義、要實現

資料結構c語言版順序的刪除

#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct { int data[MAX]; int last; }seqlist

Python自學樂-裝飾器

擴展性 func 可擴展性 函數調用 順序 簡單的 代碼 tar 統計 以前學過點 面向對象的知識,我感覺這之間是有關聯的,比如說裝飾器的第一個要素是對被裝飾的函數的封閉性,不允許更改;第二個就是對裝飾器本oj身的可擴展性。 裝飾器要點:高階函數+嵌套函數=裝飾器 需要掌握

Unix/Linux程序設計getopt函數

getopt函數、命令行參數解析Linux中getopt函數用法: 1、函數作用: getop函數用於解析命令行參數的以'-'或者‘--'開頭的參數選項,除去'-'或者'--'選項元素 如果被重復調用,則它將會依次返回每

資料結構補課 - 線性

線性表的概念: 線性表的要點:是線性結構、由同類型資料元素構成、是有序序列。 表的起始位置叫 表頭,表的結束位置叫 表尾。 表中元素個數叫 線性表的長度。 線性表沒有元素時,叫空表。   線性表的抽象資料型別描述: 型別名稱:線性表(List) //資料物件集 線性表是n個

Java單利模式飽漢模式

public class SingleInstance { public SingleInstance() { } //飽漢模式之執行緒安全和效率討論 /** * 效率低,每次進來都要同步,儘管例項不為空了 * @return */ public static synchro