1. 程式人生 > >單鏈表操作

單鏈表操作

//這一次補上鍊表的註釋,程式碼是空閒的時候敲出來的,如果有錯,希望幫忙糾正
//部分給出了詳細說明,這裡只選取了基本操作,因為更復雜的連結串列操作太繁瑣,這裡就不寫了
//如果有什麼不懂的地方,可以隨時詢問

#include <iostream>
using namespace std;
typedef int Elemtype; 

struct Node
{
	Elemtype data;
	Node *next;
};

void Init(Node **L)  //主函式裡面定義Node型指標變數plist,儲存單鏈表的頭指標
{
	//Node *L;
//	L=new Node;
	*L=NULL;       
	cout<<"初始化成功!\n";
}
//初始化函式形參要給二級指標,相應的主函式裡面實參則是對頭指標的引用

void Clear_List(Node *head)  //清空函式
{
	Node *flag;
	if(head==NULL)
	{
		cout<<"連結串列為空!\n";
		return;
	}
	while(head->next!=NULL)
	{
		flag=head->next;
		delete(head);
		head=flag;
	}
	cout<<"連結串列已經清空!\n";
}
//加一個標記,移動頭指標後賦值flag儲存下一個位置,然後刪除當前節點

Node *Creat_list(Node *head)  //賦值函式
{
	//int n=0;
	Node *p1,*p2;
	p1=new Node;
	p2=new Node;
	//head=NULL;
	cout<<"請輸入連結串列元素,以0結束輸入:"<<endl;
	cin>>p1->data;
	p1->next=NULL;
	while(p1->data!=0)
	{
		//n=n+1;
		//if(n==1)
		if(head==NULL)
			head=p1;
		else
			p2->next=p1;
		p2=p1;
		p1=new Node;
		cin>>p1->data;
		p1->next=NULL;
	}
	
	//cout<<head->data;
	return head;
}
//讀入連結串列元素,在while迴圈裡面每次將當前指標儲存下來,然後不斷向後更新

void List_length(Node *head)
{
	int i=0;
	while(head!=NULL)
	{
		i++;
		head=head->next;
	}
	cout<<"連結串列長度length: "<<i<<endl;
}

void Out_list(Node *head)
{
//	cout<<head->data;
	if(head==NULL)
		cout<<"連結串列為空!\n";
	else
	{
		while(head!=NULL)
		{
			cout<<head->data<<" ";
			head=head->next;
		}
		cout<<endl;
	}
}

Elemtype Get_elem(int index,Node *head) //給定下標,求節點元素
{
	int j=0;
	//Node *p;
	while(head!=NULL)
	{
		j++;
	    if(j==index)
			break;
		head=head->next;
	}
	if(j<index)
	{
		cout<<"選取的範圍超出連結串列長度!\n";
		return 0;
	}
	return head->data;
}
//給定的下標index,只需遍歷連結串列,當節點數符合要求時即可


int locate_elem(Node *head,Elemtype _First)  //給定節點元素,求第一個下標(也可以擴充套件求多個點的下標)
{
	int n=1;
	while(head!=NULL)
	{
		if(head->data==_First)
			return n;
		else
			n++;
		head=head->next;
	}
	cout<<"單鏈表裡不存在這個元素!\n";
}
//同理,遍歷查找出給定元素,然後直接返回下標

bool Insert_elem(Node *head,Elemtype insert_elem,int index)
{
	Node *p,*q;
	if(index<1)
	{
		cout<<"輸入下標有誤!\n";
		return false;
	}
	int i=1;
	while(head!=NULL)
	{
		i++;
		head=head->next;
		if(i==index-1)
		{
			p=q=new Node;
			q=head;
			//head=head->next;
			(*p).data=insert_elem;  
			//這裡除錯了好久。。。開始我是想定義一個節點和一個指標的,輸出的時候會報錯
			//最後還是覺得都定義指標吧,p那裡不加括號的話也會報錯
			(*p).next=head->next;
			q->next=p;
			//p->next=head->next;
			//p->data=insert_elem;
			return true;
		}
	}
	return false;
}
//插入步驟稍微多些,要另外定義兩個指標,思路就是遍歷到給定下標的前一個下標,同時指標q記錄下位置
//而另外一個指標p儲存節點資料,並且使它指向頭指標下一個點的地址,最後使q指向p即可


bool delete_Node(Node *head,int index)
{
	int i=1;
	if(index<1)
	{
		cout<<"輸入下標值有誤!\n";
		return false;
	}
	while(head!=NULL)
	{
		i++;
		head=head->next;
		if(i==index-1)
		{
			Node *p;
			p=new Node;
			p=head;
			head=head->next;
			p->next=head->next;
			return true;
		}
	}
	return false;
}
//操作類似於插入,不多說

bool Change_Node_Elem(Node *head,int index,Elemtype Example3)
{
	int i=1;
	if(head==NULL||index<1)
	{
		cout<<"輸入錯誤或連結串列為空!\n";
		return false;
	}
	while(head!=NULL)
	{
		i++;
		head=head->next;
		if(i==index)
		{
			head->data=Example3;
			return true;
		}
	}
	return false;
}
//也是遍歷連結串列找到給定位置,然後更新資料

int main()
{
	//Node *plist=NULL;
	Node *plist;
	Elemtype Example1=5,Example2=7,Example3=9;
	cout<<"建立一個單鏈表(plist):\n";
	Init(&plist);     //初始化
	plist=Creat_list(plist);  //建立單鏈表,給單鏈表賦值,返回頭指標

	cout<<"列印原始連結串列:\n";
	Out_list(plist);
	cout<<endl;

	cout<<"連結串列第三個節點的元素值為: "<<Get_elem(3,plist)<<endl; 
	cout<<endl;
	//呼叫Get_elem函式,返回連結串列第三個節點內元素值

	//cout<<"輸出連結串列長度:\n";
	List_length(plist);
	cout<<endl;

	cout<<"連結串列plist第一次出現 "<<Example1<<" 值的下標:"<<locate_elem(plist,Example1)<<endl; 
	cout<<endl;
	//呼叫locate_elem函式,返回連結串列內第一個出現Example1元素的節點數

	
	cout<<"將元素 "<<Example2<<" 插入連結串列第四個節點上:"<<endl;
	if(Insert_elem(plist,Example2,4))
		cout<<"Insert is OK!\n";
	else
		cout<<"Insert is not OK!\n";
	cout<<"改變後的連結串列為:"<<endl;
	Out_list(plist);
	cout<<endl;


	cout<<"將連結串列第七個節點刪除:"<<endl;
	if(delete_Node(plist,7))
		cout<<"Delete is OK!\n";
	else
		cout<<"Delete is not OK!\n";
	cout<<"改變後的連結串列為:"<<endl;
	Out_list(plist);
	cout<<endl;


	cout<<"將連結串列plist中第三個節點的元素換成 "<<Example3<<endl;
	if(Change_Node_Elem(plist,3,Example3))
	{
		cout<<"改變後的連結串列為:\n";
		Out_list(plist);
	}
	else
		cout<<"數值改變失敗!\n";
	cout<<endl;

	cout<<"執行清空函式:"<<endl;
	Clear_List(plist);
	return 0;
}

相關推薦

帶頭結點的單鏈操作說明

內存 arr 位置 not space n) end front tin 一、單鏈表簡介 相對於以數組為代表的“順序表”而言,單鏈表雖然存儲密度比較低(因為數據域才是我們真正需要的,指針域只是用來索引,我們並不真正需要它),但是卻具有靈活分配存儲空間、方便數據元素的刪除、方

C單鏈操作

i++ 釋放 str alloc malloc 指向 clear stdio.h print #include <stdio.h> #include <stdlib.h> #define ElemType int #define Statu

java 模擬單鏈操作

star node next ray datanode lse util class null 節點類 public class ListNode {int data;//數據ListNode next;//指針public ListNode(int x){data=x;}

資料結構-單鏈操作

// // main.c // Link_List // // Created by Smallflyfly on 2018/11/9. // Copyright © 2018 fang. All rights reserved. // #include <stdio.h>

單鏈操作之一元多項式的合併

多項式就是單項式的加減法,對於單項式可以用一組數表示,例如2X^3,可以表示為(2,3)。我們可以使用單鏈表來進行多項式的合併操作。 一:首先我們先建立新的資料型別multi typedef struct multi{ int coef; int index; s

libevent中單鏈操作

#include <stdio.h> #ifdef QUEUE_MACRO_DEBUG /* Store the last 2 places the queue element or head was altered */ struct qm_trace {   &

C++ 單鏈操作總結

第一、單鏈表的定義和操作 #include <iostream> using namespace std; template <typename T> struct Node { T data; Node* next; }; templat

資料結構上機測試2-1:單鏈操作A

#include <stdio.h> #include <string.h> #include <stdlib.h> int sum; struct node { int data; struct node *

輸入字串,建立一個單鏈,操作單鏈使每相鄰的兩個字元交換位置

  題目如上圖所示 ,程式碼如下: #include <iostream> #include <string> using namespace std; stru

python 單鏈操作

寫在之前 在程式設計裡,我們經常需要將同為某個型別的一組資料元素作為一個整體來使用,需要建立這種元素組,用變數來記錄它們或者傳入函式等等等等,「線性表」就是這樣一組元素的抽象,它是某類元素的集合並且記錄著元素之間一種順序關係,是最基本的資料結構之一,在實際程式中運用非常

單鏈操作函式C++實現

最近在學習資料結構的連結串列,剛開始接觸,肯定有某些沒發現的錯誤,歡迎大家指出來。 好了,不說廢話了,直接上程式碼 首先是單鏈表的.H檔案 #pragma once typedef int DataType; #define Node ElemType //定義節點

單鏈操作

//這一次補上鍊表的註釋,程式碼是空閒的時候敲出來的,如果有錯,希望幫忙糾正 //部分給出了詳細說明,這裡只選取了基本操作,因為更復雜的連結串列操作太繁瑣,這裡就不寫了 //如果有什麼不懂的地方,可以隨時詢問 #include <iostream> using

資料結構之---c語言實現迴圈單鏈操作

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

帶頭結點的單鏈操作(頭插法)-c++

span str out let 單鏈表 null 頭結點 操作 truct c++編寫 帶頭結點的單鏈表操作(頭插法)(和c語言差不多) #include<iostream> #include<conio.h> using namespa

單鏈實現及其基本操作

rate || == tac rgs 是否 targe param val import java.util.HashMap; import java.util.Scanner; import java.util.Stack; /** * *

【C++/數據結構】單鏈的基本操作

clear default als troy pub 插入 else fonts pac #pragma once #ifndef _CLIST_H_ #define _CLIST_H_ #include <iostream> #include <

單鏈的基本操作實現

turn lag 個數 信息 listt 帶頭結點 img 鏈表的基本操作 原因 1、寫這篇博文的原因 C語言有三個重要部分:流程控制、函數、指針。 對於指針,單單了解它的簡單運用是遠遠不夠的,最重要的是學習鏈表。所以這篇文章通過用C語言實現鏈表的一些基本操作和總結,希望對

單鏈的基本操作

def cat html str 開始 建立 新的 UC body 單鏈表基本操作函數 /*************************************************************************************//

遞歸實現單鏈的各種基本操作

name node erro 入棧 get find 比較 spa 遞歸循環 1 #include<iostream> 2 using namespace std; 3 4 #define OK 1 5 #define ERROR 0