2020年2月22日 星期六

程式設計師應有的程式技能-C語言資料結構-雙向鏈結範例

详解Linux内核双向循环链表算法的实现(上)
原创tanglinux 最后发布于2012-02-27 18:44:29 阅读数 4153

开发平台:Ubuntu11.04
编译器:gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
内核源码:linux-2.6.38.8.tar.bz2

    据我们所知,单链表只有一个指向其直接后继的指针域,而且只能从某个结点出发顺着指针域往后寻查其他结点。若要寻查结点的直接前趋,则需要从头指针重新开始。为了克服单链表这种单向性的缺点,可利用双向链表。顾名思义,在双向链表的结点中有两个指针域,其一指向直接后继,另一个指向直接前趋。

    双向循环链表指的是终止结点的next的指针域指向头结点,头结点的prior指针域指向终止结点,如下图所示:



1、一般双向循环链表的实现

例子所用的结构体如下:

#include <stdio.h>
#include <stdlib.h>

typedef int data_type;

typedef struct double_listnode {
    data_type data;
    struct double_listnode *prior, *next;
}double_listnode_t, *double_listnode_p;
 
双向循环链表的运算
(1)、创建(带头结点)
通过循环依次创建n个数据域为整数的结点,示例代码如下:

static double_listnode_t *init_double_list(int n)
{
    int i;
    double_listnode_p head, p, s;
 
    head = (double_listnode_t *)malloc(sizeof(double_listnode_t));
    head -> prior = head -> next = head;

    p = head;
    for (i = 0; i < n; i++) {
s = (double_listnode_t *)malloc(sizeof(double_listnode_t));
s -> data = i + 1;

s -> next = head;
head -> prior = s;

s -> prior = p;
p -> next = s;

p = s;
    }

    return head;
}

(2)、按结点在链表中的位置查找

示例代码如下:


static double_listnode_t *get_double_listnode(double_listnode_p head, int i)
{
    double_listnode_p p = head;
    int j = 0;

    while (p -> next != head && j < i) {
p = p -> next;
j++;
    }

    if (i == j)
return p;
    else
return NULL;
}

(3)、在链表中的i位置插入一个结点

首先要获得i-1结点的地址,然后初始化数据域并插入,示例代码如下:




static void insert_double_listnode(double_listnode_p head, int i, data_type data)
{
    double_listnode_p tmp, p = NULL;

    p = get_double_listnode(head, i - 1);
    if (p == NULL) {
fprintf(stderr, "position error\n");
exit(-1);
    }

    tmp = (double_listnode_t *)malloc(sizeof(double_listnode_t));
    tmp -> data = data;

    tmp -> prior = p;
    tmp -> next = p -> next;

    p -> next -> prior = tmp;
    p -> next = tmp;
}

(4)、删除链表的i结点

先获得i结点的地址,然后删除,示例代码如下:




static void delete_double_listnode(double_listnode_p head, int i)
{
    double_listnode_p p = NULL;

    p = get_double_listnode(head, i);
    if (p == NULL || p == head) {
fprintf(stderr, "position error\n");
exit(-1);
    }

    p -> prior -> next = p -> next;
    p -> next -> prior = p -> prior;

    free(p);
}

(5)、打印链表

示例代码如下:


static void print_double_listnode(double_listnode_p head)
{
    double_listnode_p p = head -> next;

    while (p != head) {
printf("%d ", p -> data);
p = p -> next;
    }
    printf("\n");
}
(6)、销毁链表

示例代码如下:


static void destroy_double_list(double_listnode_p head)
{
    double_listnode_p s, p = head -> next;

    while (p != head) {
s = p;
p = p -> next;
free(s);
    }
    free(head);
}

综合测试上述所讲函数的代码如下:


int main(void)
{
    int a = 10;
    double_listnode_p head;

    head = init_double_list(a);
    print_double_listnode(head);

    insert_double_listnode(head, 7, 11);
    print_double_listnode(head);

    delete_double_listnode(head, 5);
    print_double_listnode(head);

    destroy_double_list(head);

    return 0;
}

    综合测试代码的功能是先创建10个结点的双向循环链表,然后在链表的第7位插入一个数据域为11的结点,再然后删除链表的第5个结点,最后销毁整个链表。综合测试代码输出结果如下:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 11 7 8 9 10
1 2 3 4 6 11 7 8 9 10

————————————————
版权声明:本文为CSDN博主「tanglinux」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/npy_lp/article/details/7294494

【資料引用資訊】
google關鍵字:详解Linux内核双向循环链表算法的实现(上)

程式設計師應有的程式技能-C語言-建立開發環境

第一部分 安裝工具

Linux程式設計第01篇:建立C和C++的環境,在Linux下寫C和C++的程式

 facebook PLURK twitter
一般撰寫C或C++語言都是在微軟Windows系列下撰寫,今天要來使用Linux環境下撰寫,因為Linux是免費的作業軟體,而且非常適合架設伺服器,基於這個原因,我想要在Linux環境下來學習C及C++等語言,不過要學習之前,要先建立好環境,這件事在微軟的作業系統環境下也是很重要的,沒先把環境建立好,後續根本沒辦法編譯及執行程式。
Linux的發行版本很多,有Red Hat、CentOS、Fedora、Ubuntu等等,基於方便性及普遍性,我決定使用Ubuntu Server 16.04 LTS版本,其作業系統下載網址:

為方便學習,我使用VMware Workstation 12,模擬Ubuntu作業系統,有關VM的使用方法在此無敘述,請自行上網查詢。

Ubuntu進入畫面

要在Linux環境下撰寫C和C++,需要以下3種軟體:
1-安裝編譯器:Linux的C和C++編譯器分別稱為gccg++,請鍵入以下指令:

sudo apt-get install gcc g++

輸入密碼後,將開始下載及安裝


完成後分別輸入:

gcc -v

g++ -v
檢查有無安裝完成,出現上面2個圖案內容即為完成安裝。
2-安裝build-essential:這是一個很重要的東西,一定要安裝,沒有安裝gcc和g++都沒辦法編譯及輸出,而且會出現很多錯誤訊息。

請輸入:

sudo apt-get install build-essential


輸入密碼後開始安裝


3-安裝編輯器vim:vim就如同Windows下的文字編輯器,可以讓我們編寫程式,Ubuntu預設下只有vi,沒有vim,因為vi屬於舊版編輯器,不是很好用,所以我們要安裝vim編輯器,所以請輸入:
sudo apt-get install vim

輸入密碼後開始安裝
如果安裝完上述3個必備軟體後,我們可以開始在Linux的作業系統下開始寫C或C++語言程式囉!!

【資料引用資訊】
google關鍵字:Linux程式設計第01篇:建立C和C++的環境,在Linux下寫C和C++的程式

第二部分 測試安裝工具

日誌2016-02-09 20:00
使用linux寫c語言

 作者:問天
{1}.打開終端機(Terminal):

Debian:




Ubuntu:

{2}.編輯檔案:
$ vim <檔名>
例:$ vim hello.c

{3}.編輯:
 i 進入編輯模式
輸入程式
例:
#include<stdio.h>
int main(void){printf("hello work!\n");return 0;}
Esc退出編輯
輸入 :wq 儲存並退出
w(儲存)、q(退出)

{4}.編譯:
編譯程式碼
$ gcc -o <輸出檔名> <原檔名>
例:$ gcc -o hello hello.c
輸出檔名可有可無,據說預設是 a.out

{5}.執行:
$ ./<檔名>
例:$ ./hello


{6}.結果:


《完》



【資料引用資訊】

google關鍵字:使用linux寫c語言

網址:https://m.gamer.com.tw/home/creationDetail.php?sn=3097436


補充部分 VIM的用法

2012年5月27日 星期日


[Vim] 複製、貼上、搜尋、復原


Vim的複製、貼上、搜尋是簡單的指令,也是常用的指令:
        選擇一段文字,可以在一般模式下鍵入大寫V,或者小寫v來選擇文字區塊。鍵入大寫V是游標經過一行就選擇一行,小寫v則是游標經過的位置就選擇起來。
        選擇好文字區塊後,按下小寫y可以複製起選擇的文字,按下d可以刪除掉選取的文字。
        在想要貼上文字的地方,按下p就可以貼上剛才複製好的文字。
        如果要復原剛才的動作,可以在一般模式下鍵入u。
        要搜尋字串,可以在一般模式下輸入"/",並在斜線後方鍵入要搜尋的字串,並按下Enter。當找到一個符合的字串後,若要繼續往下搜尋,可以鍵入小寫n。