单链表C/C++实现(数据结构严蔚敏)
生活随笔
收集整理的這篇文章主要介紹了
单链表C/C++实现(数据结构严蔚敏)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面是項目:頭文件、源文件、測試文件
1、頭文件LinkList.h:
#include<iostream> #include<malloc.h> using namespace std;#define ok 1 #define error 0 #define flow 0typedef int Status; typedef int ElemType;typedef struct LNode{ElemType data;struct LNode* next;}LNode; typedef LNode* LinkList;//初始化鏈表 Status InitList( LinkList& L, int n);//銷毀鏈表 Status DestroyList(LinkList& list);//打印鏈表 Status Print(const LinkList& L); //在第i個位置前添加數據節點 Status ListInsert( LinkList& L, int i, ElemType e) ;//刪除第i個位置的節點 Status ListDelete( LinkList& L, int i, ElemType& e);//獲取鏈表的第i個位置數據,并返回 Status Get( const LinkList& L, int i, ElemType& e);//將遞增的LA和LB進行歸并,重新放入LC中 Status MergeList( LinkList& La, LinkList& Lb, LinkList& Lc);2、源文件LinkList.cpp
#include "LinkList.h"//使用頭節點反序初始化鏈表 Status InitList( LinkList& L, int n){L = (LinkList)(malloc( n * sizeof(LNode)));if(!L) return error;L->next = NULL;cout<<"請輸入"<<n<<"個數據節點的數據\n"<<endl;for(int i=0; i < n; i++){LinkList p = (LinkList)(malloc(sizeof(LNode)));cin>>p->data;p->next = L->next;L->next = p;}return ok; }//打印鏈表 ,由于初始化是按照頭指針進行的,所以打印出來的是倒敘鏈表 Status Print(const LinkList& L){LinkList p = L->next;if(!p) return error;while(p){cout<<p->data<<" ";p=p->next; }cout<<endl;return ok; }//銷毀鏈表 Status DestroyList( LinkList& L){}//在第i個位置前添加數據節點 Status ListInsert(LinkList& L, int i, ElemType e){LinkList p = L;int j = 0;//找到第i-1個節點的地址放入p中 while(p && j < i-1){p = p->next; j++;}//第i-1個節點不存在,無法將數據e插入到第i個位置上 ,或則輸入的位置小于1。返回錯誤。 if(!p || j > i-1) return error;//新建一個節點 LinkList s = (LinkList)malloc((sizeof(LNode)));//新建節點的數據部分是e s->data = e;//新建節點的指針域是第i個節點的地址。而第i位置的地址存儲在第i-1中的指針域 p->next中中;s->next = p->next;//將第-1的指針域修改為新建節點的地址,就是s。使得第i-1的節點指針域指向新建節點 p->next = s;return ok;}//刪除第i個位置的節點 Status ListDelete( LinkList& L, int i, ElemType& e){LinkList p = L;int j = 0;//尋找第i個節點的地址,放入p的指針域p->next中,p是第i-1位置的節點 while(p->next && j < i-1){p = p->next;j++;}//如果第i位置節點不存在,就返回錯誤 if(!(p->next) || j < i-1) return error;//讓第i-1位置的p節點的指針域p->next指向第i+1位置的節點,然后釋放第i位置的空間。 LinkList q = p->next;p->next = q->next;e = q->data;free(q); }//獲取鏈表的第i個位置數據,并返回 Status Get(const LinkList L, int i, ElemType& e){//L為頭節點的地址,L->next存儲的是第一個節點的地址,L->data,不存儲數據。 //獲取第一個節點的地址,并將計數器設置為1 LinkList p = L->next;int j = 1;//循環遍歷節點 while(p && j < i){p = p->next; j++;}//如果節點的地址為NULL,或則查看的節點數大于 計數器一開始就大于了i, 說明第i個位置的數據不存在,返回錯誤0 if(!p || j > i){return error;}//如果存在,就賦值給e e = p->data;return ok; }//將遞增的LA和LB進行歸并,重新放入LC中 Status MergeList( LinkList& La, LinkList& Lb, LinkList& Lc){//將La和Lb的第一個數據節點的地址賦值給pa, pb LinkList pa = La->next;LinkList pb = Lb->next;Lc = (LinkList)malloc(sizeof(LNode));Lc->next = NULL; LinkList pc = NULL;int i = 1;int j = 1;//如果La第一個節點的數據大于Lb的第一個數據節點,就將Lb的數據存到Lc中 while(pa && pb){ if(pa->data <= pb->data){pc = (LinkList)malloc(sizeof(LNode)); pc->data = pa->data;pc->next = Lc->next;Lc->next = pc;pa = pa->next;}else{pc = (LinkList)malloc(sizeof(LNode)); pc->data = pa->data;pc->next = Lc->next;Lc->next = pc;pb= pb->next;} }while(pa){pc = (LinkList)malloc(sizeof(LNode));pc->next = Lc->next;Lc->next = pc;pc->data = pa->data;pa = pa->next;}while(pb){pc = (LinkList)malloc(sizeof(LNode));pc->next = Lc->next;Lc->next = pc;pc->data = pb->data;pb = pb->next;}}3、測試文件:test.cpp
#include<iostream> #include "LinkList.h" using namespace std;int main(void){LinkList La, Lb, Lc;ElemType e;int i, n ; InitList(La, 4);cout<<"鏈表創建完畢"<<endl;InitList(Lb, 4);cout<<"鏈表創建完畢"<<endl;MergeList(La, Lb, Lc);Print(Lc);return 0; }《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的单链表C/C++实现(数据结构严蔚敏)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性表的C/C++实现(数据结构 严蔚敏
- 下一篇: 循环链表C/C++实现(数据结构严蔚敏版