1. 程式人生 > >資料結構C語言版--單鏈表的基本功能實現

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

/*
* 構造一個鏈式儲存的線性表(當輸入9999時,結束構造過程),然後輸出該線性表
* 並統計該線性連結串列的長度 。
*注:new和delete是C++的運算子
    malloc和free是C++/C的標準庫函式 
*/ 
#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//單鏈表的儲存結構 
struct LinkNode{
    int data;                   //節點的資料域 
    struct LinkNode *next;      //節點的指標域 
}; //1.列印輸出,連結串列的資料,其中連結串列指向頭節點 void print(LinkNode *L){ LinkNode *p; //定義一個指標變數p p = L->next; //使p指向連結串列L的第一個資料 while(p != 0){ printf("%d、",p->data); p = p->next; //指標後移 } printf("\n"); //換行 } //2.連結串列長度 int Length_LinkList(LinkNode *L){ LinkNode *p; //定義一個指標變數
int len = 0; // 定義一個計數器,計算節點個數 p = L->next; //指標P指向連結串列的第一個節點 while(p != NULL){ len++ ; p = p->next; //指標後移,即指向當前節點的後繼節點 } return len; //返回連結串列長度 } //3.按位置查詢,單鏈表中尋找第i個元素,返回指向第i個節點的指標 LinkNode* FindI_LinkNode(LinkNode *L,int
i){ LinkNode *p; //定義指標變數 int j = 1; //定義計數器 p = L->next; //讓p指向頭節點 while(j < i){ //當沒有找到第i個節點 p = p->next; //指標後移 j++; //計數器加一 } return p; } //4.按值查詢,單鏈表中尋找元素e,返回元素e所在的位置 int FindE_LinkNode(LinkNode* L,int e){ LinkNode *p; int count=0; p=L->next; while(p != NULL) { count++; if(p->data==e) return (count); p=p->next; } return 0; } //5.在表頭插入資料 int Insert_head(LinkNode* &L,int x){ //在以H為頭節點的單鏈表中在頭節點後插入資料 LinkNode *t; //定義指標 t = new LinkNode; //申請空間 t->data = x; //向新節點中寫入資料 t->next = L->next; //把連結串列的第一個節點的地址寫入到新節點中,也就是新節點的指標域置為null L->next = t; //讓頭節點的next指標指向新節點 ,把新節點接到連結串列上 return OK; } //6.在表尾插入資料 int Insert_end(LinkNode *L,int x){ LinkNode *t; t = new LinkNode; //申請空間 t->data = x; //把資料賦到新節點的資料域 while(L->next != NULL){//當連結串列不為空時,指標向後移動,因為資料要插入最後一個位置 L = L->next; //指標向後移動 } //直到指標移到最後一個 L->next = t; //將連結串列末尾節點的下一節點指向新節點 t->next = NULL; //新節點的指標域置空 return OK; } //7.在第i個位置插入資料 int Insert_LinkNode(LinkNode *L,int i,int x){ if(i < 1 || i > Length_LinkList(L)){ printf("插入位置錯誤!\n"); return ERROR; } LinkNode *p; if(i == 1) p = L; //指標P指向頭節點 else p = FindI_LinkNode(L,i-1); //讓P指向第i-1個節點 Insert_head(p,x); //將x插入假設以p節點為頭節點的連結串列中 return OK; } //8.刪除首元節點 int Del_Head(LinkNode *L){ if(L->next != NULL){ LinkNode *p; //定義一個指標變數 p = L->next; //指標p指向第一個節點,p->next指向下一個節點 L->next = p->next; //頭節點的指標域儲存第二個節點的地址 delete p; //刪除第一個節點,釋放空間 }else{ printf("空表!\n"); return FALSE; } } //9.刪除表尾節點 int Del_End(LinkNode *L){ if(L->next != NULL){ LinkNode *p; LinkNode *q; int i; p = L->next; //指標p指向第一個節點 for(i = 1;i < Length_LinkList(L) - 1;i++){ p = p->next; } q = p->next; p->next = NULL; //free(q); delete q; }else{ printf("空表!"); } } //10.刪除指定位置上的元素 int Del_i(LinkNode* L,int i){ if(i<1 || i>Length_LinkList(L))//如果刪除位置不合法 { printf("刪除位置不合法!"); return 0; } LinkNode *p; if(i==1) p=L; //讓p指向頭結點 else p=FindI_LinkNode(L,i-1); //讓p指向第i-1個結點 Del_Head(p); //刪除以p為頭結點的連結串列的第一個資料結點 return OK; } /* * 在主函式中傳遞引數,傳參分為值傳遞和址傳遞, */ int main(){ int i,x,count,m; LinkNode *H; //定義連結串列指標 LinkNode *add; H = new LinkNode; //申請空間 //H->data = -1; //為成員變數資料賦值 H->next = NULL; //為成員變數指標賦值 printf("輸入資料:\n"); while(1){ scanf("%d",&i); if(i == 9999){ break; }else{ Insert_end(H,i); //插入資料 } } printf("The LinkNode elem is:"); print(H); //輸出資料 printf("1.請輸入從表頭插入的資料:"); scanf("%d",&i); Insert_head(H,i); printf("The LinkNode elem is:"); print(H); printf("2.請輸入從表尾插入的資料:"); scanf("%d",&i); Insert_end(H,i); printf("The LinkNode elem is:"); print(H); printf("3.請輸入要插入的位置、資料(空格隔開):\n");//判斷輸出的插入位置是否合法 scanf("%d %d",&i,&x); Insert_LinkNode(H,i,x); printf("The LinkNode elem is:"); print(H); printf("4.請輸入要查詢的位置:"); scanf("%d",&i); if(i < 1 || i > Length_LinkList(H)){ //若查詢位置不合法,返回error printf("查詢位置不合法!\n"); }else{ add = FindI_LinkNode(H,i); int e = add->data; printf("位置:%d的資料是:%d\n",i,e); } printf("4.請輸入要查詢的元素:\n"); scanf("%d",&i); m = FindE_LinkNode(H,i); if(m == 0){ printf("查無此元素!\n"); }else{ printf("資料:%d所在的位置是:%d\n",i,m); } Del_Head(H); printf("5.刪除首元節點後:\nThe LinkNode elem is:"); print(H); Del_End(H); printf("6.刪除表尾節點後:\nThe LinkNode elem is:"); print(H); printf("7.指定刪除節點的位置:\n"); scanf("%d",&i); if(i < 1 || i > Length_LinkList(H)){ //若查詢位置不合法,返回error printf("指定位置不合法!\n"); }else{ Del_i(H,i); printf("6.刪除指定節點後:\nThe LinkNode elem is:"); print(H); } count = Length_LinkList(H); printf("8.此連結串列長度為:%d\n",count); return 0; }

相關推薦

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

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

單鏈的方式實現集合的基本運算(資料結構C語言

①用單鏈表來實現結合的基本運算,首先用的是單鏈表所以我們就先給它建立一個頭結點並且為它分配空間,而結點的結構體中定義了兩個屬性 data域和next指標域。 ②實現集合元素的插入。我用的是單鏈表頭插法的方法,先建立一個新的結點用於輸入值然後插入到線性連結串列中去,然後依次挨

資料結構c語言 嚴蔚敏 順序線性12個基本操作及演算法的實現

標頭檔案: c1.h (相關標頭檔案及函式結果狀態程式碼集合) /* c1.h (程式名) */ #include<string.h> #include<ctype.h> #include<malloc.h> /

資料結構與演算法》-單鏈基本操作的C語言實現

最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。 所用教材《資料結構與演算法分析》by Mark Allen Weiss 《資料結構》(C語言

資料結構(C語言 嚴蔚敏著)——線性

線性表定義:由零個或多個數據元素組成的有限序列。 · 需注意幾個關鍵點: -它是一個序列,也就是說元素之間是有先來後到的。 -若元素存在多個,則第一個元素無前驅,而最後一個元素無後繼,其他元素有且只有一個前驅和一個後繼。 -線性表強調是有限的,無論計算機發展到多強大,

學習筆記------資料結構(C語言)陣列之三元組順序

//TSMatrix.cpp #include"predefined.h" #include"TSMatrix.h" Status TransposeSMatrix(TSMatrix M,TSMat

順序棧的九種基本操作和實現資料結構C語言清華大學嚴蔚敏)

棧是僅限定在表尾進行插入和刪除操作的線性表,在嚴蔚敏版的C語言版的資料結構中共定義了九種棧的基本操作;分別是構造 銷燬 清空 棧長 棧頂 插入 刪除 遍歷。下面就是程式碼實現: 標頭檔案和巨集定義(

資料結構C語言線性連結串列的12個基本操作

線性連結串列的12個基本操作 分別是:構造 銷燬 清空      判空  表長 取元      定位  前驅 後繼      插入 刪除遍歷;在此為了好記我分別二字短語三三結合 ,接下來會一一解釋。 標頭檔案和巨集定義 #include<iostream> #i

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

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

資料結構C語言(第二章迷宮)

轉自未空blog   //我剛開始對STACK的記憶體分配那有點問題,後來用這個程式碼除錯了下,感覺有點明白了,   地址由高到低分配,然後程式碼中的base和top剛開始指向地址最低的地方,記憶體不夠時重新在原有基礎上新增記憶體,top指向原有的棧頂,然後繼續

資料結構c語言 嚴蔚敏(演算法2.1 將所有在Lb中但不在La中的元素插入到La中)

標頭檔案: c1.h (相關標頭檔案及函式結果狀態程式碼集合) /* c1.h (程式名) */ #include<string.h> #include<ctype.h> #include<malloc.h> /

資料結構(C語言 嚴蔚敏著)——樹

· 樹(tree)是n(n>=0)個結點的有限集。當n=0時成為空樹,在任意一顆非空樹中: //這裡只需掌握定義,重點在二叉樹      -有且僅有一個特定的稱為根(Root)的結點;     -當n>1時,其餘結點可分為m(m>0)個互不相交的有限集

資料結構(C語言 嚴蔚敏著)——棧和佇列

棧的定義: · 書本定義:棧是一個後進先出的線性表,它只要求只在表尾 進行刪除和插入操作。 · 通俗定義:棧就是一個特殊的線性表(順序表,連結串列),操作上有一些特殊性:     -棧的元素必須“後進先出”。     -棧的操作只能在這個線性表的表尾進行。    

資料結構(C語言 嚴蔚敏著)——串

關於串,下面只介紹堆分配儲存的串。 · 由於堆分配儲存結構的串既有順序儲存結構的特點,處理方便,操作中對串長   又沒有任何限制,更顯靈活,因此在串處理的應用程式中也常被選用。 更char陣列類似 下面直接貼程式碼: #include <stdio.h>

資料結構(C語言)》嚴蔚敏---第一章緒論

資料結構 資料結構主要研究非數值計算問題,資料結構是一門研究非數值計算程式設計中的操作物件,以及這些物件之間關係和操作的學科。 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。 資料結構包括邏輯結構和儲存結構兩個層次。 邏輯結構的四種基本關係: 集合結構 線性結構 樹結構 圖

資料結構c語言》嚴蔚敏學習之路

    大學物聯網工程專業,沒有計組、計網、微原和通原的我,不知道怎麼在這個交叉學科中活下去(學校優秀,認為隨著政策的利好,學生都有工作課程隨意點)。所以,認認真真寫下《資料結構c語言版》嚴蔚敏學習之路,記錄從入門到出不去的過程。     先學離散數學,我認為這是先修

資料結構C語言赫夫曼樹

/*自己編寫的C語言的赫夫曼樹*/#include<stdio.h> #include<string.h> #define HUFFSIZE 8 #define TOTALSIZE (2*HUFFSIZE) typedef struct {

資料結構(C語言)》- 樹和二叉樹

本文將討論非線性資料結構中的樹型結構。樹型結構中樹和二叉樹最常用,直觀來說,樹是以分支關係定義的層次結構,樹結構在客觀世界中廣泛存在,如人類社會的族譜,最上面是族長,然後下面依次是族長的孩子,孫子等等。這就可以用樹來更加形象的表示。樹在計算機領域中也有十分廣泛地

資料結構C語言之括號匹配

//括號匹配: #include<stdio.h> #include<stdlib.h> #define Stack_size 100 #define Stackincream

資料結構c語言 嚴蔚敏 課本原始碼

第2章  線性表 - 單鏈表順序儲存結構——《資料結構》-嚴蔚敏.吳偉民版概述       資料結構的學習當然要從線性表學起,而線性表裡首先需要學習單鏈表,這裡從單鏈表最簡單的順序儲存結構(本質就是可變陣列儲存)開始。解析       單鏈表強調元素在邏輯上緊密相鄰,所以首先