1. 程式人生 > >C語言:單鏈表實現(二) 就地逆置,就地歸併

C語言:單鏈表實現(二) 就地逆置,就地歸併

#include<iostream>
#include<stdio.h>
#include<math.h>
#define LEN sizeof(struct Nodelist)
using namespace std;
typedef struct Nodelist
{
	int data;;
	struct Nodelist *next;
}Nodelist;
//函式宣告
void Error(char *s);                      //錯誤處理函式
Nodelist *CreatNode(void);                 //後插法建立單鏈表
Nodelist *ReverseList(Nodelist *head);     //就地逆置函式
void MeryNode(Nodelist &l1, Nodelist &l2); //就地歸併函式
void printNode(Nodelist L);                //輸出函式
//函式定義
void Error(char *s)   //錯誤處理函式
{
	cout << s << endl;
	exit(1);
}
Nodelist *CreatNode(void)  //後插法建立單鏈表
{
	int  i, n;
	Nodelist *head, *p, *q;
	p = q = NULL;
	head = NULL;
	cout << "請輸入您要建立的連結串列長度:";
	cin >> n;
	cout << "請輸入您要輸入的資料:" << endl;;
	for (i = 0; i<n; ++i)
	{

		p = (Nodelist *)malloc(LEN);
		cin >> p->data;
		if (head == NULL)  //單個結點
			q = head = p;
		else
			q->next = p;
		q = p;
	}
	p->next = NULL;
	return head;
}
void printNode(Nodelist L)  //將連結串列依次資料輸出
{
	Nodelist *p = &L;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
Nodelist *ReverseList(Nodelist *head)  //就地逆置函式
{ 
	Nodelist *p, *q, *r;
	p = head;
	q = r = NULL;
	while (p)
	{
		q = p->next;
		p->next = r;
		r = p;
		p = q;
	}
	return r;
}
void MeryNode(Nodelist &l1, Nodelist &l2) //就地歸併函式
{
	Nodelist *pa, *pb, *pc, *pd;
	pa = &l1;
	pb = &l2;
	pc = pa;
	while (pa&&pb)
	{
		if (pa->data <= pb->data)
		{
			pc = pa;
			pa = pa->next;
		}
		else
		{
			pd = pb->next;
			pb->next = pa;
			pc->next = pb;
			pc = pb;
			pb = pd;
		}
	}
	if (pb!=NULL)
		pc->next = pb;
}
int main()   //主函式測試
{
	Nodelist *head1, *head2;

	head1 = CreatNode();
	cout << "逆置前的連結串列資料:" << endl;
	printNode(*head1);
	Nodelist *head3 = ReverseList(head1);
	cout << "逆置後的連結串列資料:" << endl;
	printNode(*head3);

	head2 = CreatNode();
	cout << "逆置前的連結串列資料:" << endl;
	printNode(*head2);
	Nodelist *head4 = ReverseList(head2);
	cout << "逆置後的連結串列資料:" << endl;
	printNode(*head4);

	cout << "就地歸併後:" << endl;
	MeryNode(*head3, *head4);
	printNode(*head3);

	return 0;
}


相關推薦

C語言單鏈實現 就地就地歸併

#include<iostream> #include<stdio.h> #include<math.h> #define LEN sizeof(struct Nodelist) using namespace std; typedef

C語言面向物件程式設計單鏈實現5

 前面我們介紹瞭如何在 C 語言中引入面嚮物件語言的一些特性來進行面向物件程式設計,從本篇開始,我們使用前面提到的技巧,陸續實現幾個例子,最後呢,會提供一個基本的 http server 實現(使用 libevent )。在這篇文章裡,我們實現一個通用的資料結構:單鏈表。  

java不用api實現單鏈反轉

這篇部落格主要講述反轉連結串列相關思路。兩種方法:時間複雜度均為O(n),空間複雜度均為O(1) 方法一:頭插法 頭插法不僅可以建立單鏈表,還可以利用其思路反轉連結串列。首先把頭節點拆下,剩下的節點依次遍歷,採用頭插法,相當於從新建立連結串列。 p

c語言數據類型

nbsp tex 字符 pre 字符串 輸入 mce 一個 命令 char 類型 1.char 變量 常量   char c; 定義一個char變量   c = ‘a’ ‘a‘字符常量   char 的本質就是一個整數,只有一個字節大小的整數 2.printf 輸出ch

C語言老司機學Python

append 設計 sta one list 老板 com oob als 標準數據類型: 共6種:Number(數字),String(字符串),List(列表),Tuple(元組),Sets(集合),Dictionary(字典) 本次學習主要是和數據類型混個臉熟,

《面向物件程式設計——C++語言描述》學習筆記

第二章 從C到C++  2.1main函式 1.C++中需要寫int main()不能只是main() 2.main()函式裡面最後有一個return 0; 3.main()被啟動程式碼呼叫,而啟動程式碼是編譯器新增到程式中的,是程式和作業系統的橋樑。 4.C++中main()中

C語言學習_查詢演算法

3 分塊查詢 演算法思想:將待查的元素均勻的分成塊,塊間按大小順序排序,塊內不排序。 具體的,設待查元素有15 個,將其按關鍵字大小分成3塊,這15個數的排列是一個有序序列,也可以給出無序序列,但也是必須得滿足分在第一塊中的任意元素小於第二塊中的所有數,第二塊中的任意元素

C語言面試題---指標篇

# include <stdio.h># include <stdlib.h># include <string.h>void getMemory( char **p , int num){ *p = malloc(num);} int main() {

Ant-Design元件Form

Ant Design of React @3.10.9 拉取專案 luwei.web.study-ant-design-pro, 切換至 add 分支,可看到 Form 表單實現效果 實現一個新增表單 思路 Create表單:@Form.create() 表單資料繫結 get

C#模擬POST提交--HttpWebRequest以及HttpWebResponse

自認為與上次介紹的WebClient最大的不同之處在於HttpWebRequest更靈活,也更強大,比如,HttpWebRequest支援Cookie,而WebClient就不支援,因此,如果要登入某個網站才能進行某些操作的時候,HttpWebResponse就派上用

c語言位元組對齊問題

上一篇已經說了一些基本的struct成員變數的記憶體對齊的問題,現在來進一步看看位域在struct的運用,對減少記憶體的使用很用幫助,特別是在嵌入式領域。廢話不多說了,看下面結構體 struct s {      char  a:4;      int      b:8;

C語言的檔案的操作

C語言的檔案的操作(二) 八.資料塊讀寫   #fread 函式是從檔案中讀出資料塊。 int fread(void *buf, int size, int count, FILE *fp); #fwrite函式是向檔案寫入資料塊。 int fwrite(void *buf

c語言順序實現 就地有序合併大小調整。

#include<iostream> #include<stdio.h> #define LIST_INIT_SIZE 100 using namespace std; struct Node { int *elem; int Len

C語言單鏈的創建、釋放、追加即總是在最後的位置增加節點

程序 mage 而不是 自己的 物理 2-66 exit 只為 對數 昨天周末給學妹講了一些指針的知識,本來我對指針就是似懂非懂的狀態,經過昨天一講,我對指針的學習就更深刻了果然給別人講課也是學習的一個方法。加上最近復習數據結構,發現我的博客裏沒有鏈表的博文,

資料結構實現陣列棧C++版

資料結構實現(二):陣列棧(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入棧操作 2.2 出棧操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析 3.1 入棧

C++叉查詢樹實現——遍歷操作

     建立好二叉樹,有時候我們需要對整個二叉樹錦星遍歷,即輸出二叉樹的所有結點元素。理論上,遍歷的方式有無數種,順序可以自己任意選定,但是絕大部分遍歷方式在實際中並沒有用處,比較有用的的遍歷方式有兩種:廣度優先遍歷、深度優先遍歷。 (1)廣度優先遍歷        

C語言單鏈實現

單鏈表 單鏈表是一種鏈式存取的資料結構,用一組地址任意的儲存單元存放線性表中的資料元素。 單鏈表結構如下: typedef int DataType; typedef struct Node { struct Node* next; /

資料結構C語言版--單鏈的基本功能實現

/* * 構造一個鏈式儲存的線性表(當輸入9999時,結束構造過程),然後輸出該線性表 * 並統計該線性連結串列的長度 。 *注:new和delete是C++的運算子 malloc和free是C++/C的標準庫函式 */ #include<st

基於Huffman樹的檔案壓縮原理及C語言實現

在上文基於Huffman樹的檔案壓縮原理及C語言實現(一)中已經介紹並實現瞭如何建立Huffman樹,得到Huffman編碼,這篇我們將會接著說。如何通過Huffman樹,實現檔案壓縮。 實現思路 任何檔案都可以看作是由位元組組成的位元組塊,將位元組看作

C語言線性單鏈相關函式和演算法的基本實現

備考期間嘗試寫了一些基本資料結構的C語言實現,現做以下記錄(基本資料元以int型為例):全域性定義及依賴:#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #d