C\C++之用結構體實現連結串列的建立、遍歷、結點插入、結點刪除
C\C++之用結構體實現連結串列的建立、遍歷、結點插入、結點刪除
叮嘟!這裡是小啊嗚的學習課程資料整理。好記性不如爛筆頭,今天也是努力進步的一天。一起加油進階吧!
#include <iostream>
using namespace std;
struct node //結點結構
{ int data ;
node * next;
};
int n=0; //全域性整型變數存放連結串列中結點個數
node * head ; //全域性指標變數存放連結串列頭結點地址-頭指標
int main()
{ node * CreateList( ); //建立連結串列函式宣告
void PrintList( node *); //輸出連結串列中結點資訊函式宣告
node * InsertNode(node *,node *); //在連結串列中插入結點函式宣告
node * DeleteNode(node *,int); //在連結串列中刪除結點函式宣告
/*建立連結串列*/
head=CreateList( );//呼叫連結串列建立函式,返回所建連結串列的頭指標
/*遍歷輸出連結串列*/
PrintList(head); //呼叫連結串列遍歷函式,輸出全部結點資訊
/*往連結串列中插入結點*/
char IsGo; //是否繼續操作標誌
cout<<endl<<"是否進行連結串列結點插入操作?(插入結點請按y或Y,退出插入操作請按其它鍵)";
cin>>IsGo;
node *stu;
while(IsGo=='y'||IsGo=='Y')
{ stu=new node; //建立要插入的新結點
cout<<endl<<"輸入要插入的新結點資料:";
cin>>stu->data; //輸入要插入的新結點資料
/*
while(stu->data==0) //如果新結點資料不為0進行結點插入
{
cout<<"您輸入的結點資料為0,退出插入結點操作";
cin>>stu->data; //輸入要插入的新結點資料
}
*/
head=InsertNode(head,stu); //呼叫插入函式,返回連結串列頭指標
cout<<"是否繼續插入新結點? (繼續插入請按y或Y,退出請按其它鍵)";
cin>>IsGo;
}
/*遍歷輸出連結串列*/
PrintList(head); //呼叫連結串列遍歷函式,輸出全部結點資訊
/*刪除連結串列結點*/
int del_num; //要刪除的結點的資料
cout<<endl<<"是否進行連結串列結點刪除操作?(刪除結點請按y或Y,退出刪除操作請按其它鍵)";
cin>>IsGo;
while(IsGo=='y'||IsGo=='Y')
{
cout<<endl<<"輸入要刪除的節點的資料:"; //輸入要插入的結點
cin>>del_num; //輸入要刪除的結點的資料
head=DeleteNode(head,del_num); //刪除後連結串列的頭地址
cout<<"是否繼續刪除結點? (繼續插入請按y或Y,退出請按其它鍵)";
cin>>IsGo;
}
/*遍歷輸出連結串列*/
PrintList(head); //呼叫連結串列遍歷函式,輸出全部結點資訊
cout<<endl<<"連結串列操作結束退出主程式..."<<endl;
return 0;
}
node * CreateList( ) //建立連結串列函式
{ node * s, * p ; // s指向新結點,p指向連結串列中最後的結點
s = new node ; //動態建立第一個新結點
cout<<"請輸入一個整數值作為新結點的資料資訊,輸入0時建立連結串列結束"<<endl;
cout<<"第"<<n+1<<"個結點"<<endl;
cin >> s->data ; //輸入新結點資料
head = NULL ; //頭指標初始值為NULL
if( s->data==0) //第一個結點資料就為0,建立一個空連結串列
{
cout<<"您建立的空連結串列"<<endl;
delete s ; //釋放資料為0的結點
}
else //建立非空連結串列
{
while ( s->data != 0 ) //通過判斷新結點資料來進行迴圈
{ if ( head == NULL ) head = s ; //頭指標賦值
else p->next = s ; //將新結點插入已有連結串列的最後
p = s ; // p指向連結串列中最後的結點
n=n+1;//結點個數增1
s = new node ; //動態建立一個新結點
cout<<"請輸入一個整數值作為新結點的資料資訊,輸入0時建立連結串列結束"<<endl;
cout<<"第"<<n+1<<"個結點"<<endl;
cin >> s->data ; //輸入新結點資料
}
p -> next = NULL ; //設定連結串列尾部為空
delete s ; //釋放資料為0的結點
cout<<endl<<"連結串列建立完成...";
cout<<"建立的連結串列中共有"<<n<<"個節點"<<endl<<endl;
}
return ( head ) ; //返回頭指標
}
void PrintList( node * head) //輸出連結串列中結點資訊函式,連結串列遍歷
{ node *p=head;
int i=1;
cout<<endl<<"遍歷連結串列..."<<endl;
if (head!=NULL) //如果連結串列非空,即連結串列中有結點
do //迴圈輸出接點資料,直到移動到連結串列尾,即最後一個結點
{ cout<<"第"<<i++<<"個結點資料為:"<<p->data<<endl;
p=p->next;
}while(p!=NULL) ;
else
{
cout<<"連結串列是空連結串列!"<<endl;
}
cout<<"連結串列中共有"<<n<<"個節點"<<endl;
}
node * InsertNode(node *head,node * s) //插入結點的函式,head為連結串列頭指標,s指向要插入的新結點
{node *p,*q;
p=head; //使p指向連結串列中的第一個結點
if(head==NULL) //原來的連結串列是空表
{ head=s; //使head指向的新結點作為頭結點
s->next=NULL;
}
else //原來的連結串列不是空表
{while((s->data>p->data) && (p->next!=NULL)) //用迴圈定位要插入的結點位置p,使s插入到p之前的位置
{q=p; //q記錄下當前的p,即q指向p的前一個結點
p=p->next; //p後移一個結點
}
if(s->data<=p->data) //要插入的結點資料比最後一個結點資料小
{ if(head==p) //判斷是否插入連結串列中的第一個結點之前
{ head=s; //插到原來第一個結點之前
s->next=p;
}
else //插到q指向的結點之後,p指向的結點之前
{ q->next=s;
s->next=p;
}
}
else //要插入的結點資料比最後一個結點資料還大
{ p->next=s; // 插到連結串列最後的結點之後,作為連結串列的尾結點
s->next=NULL;
}
}
n=n+1; //結點數加1
cout<<"成功完成一個新結點插入..."<<endl;
return (head);
}
node *DeleteNode(node *head,int delData) //刪除資料為delDate的結點的函式
{node *p,*q;
p=head; //使p指向第一個結點
if (head==NULL) //是空表
{ cout<<"該連結串列是空連結串列,不能進行結點刪除!"<<endl;
return(head);
}
//先找到要刪除的結點
while(delData!=p->data && p->next!=NULL) //p指向的不是所要找的結點且後面還有結點
{ q=p; //q用來記錄p前一個結點
p=p->next;
} //p後移一個結點
if(delData==p->data) //找到了要刪除的結點
{ if(p==head) //如果要刪除的是頭結點
head=p->next; //若p指向的是首結點,把第二個結點地址賦予head
else q->next=p->next; //否則將下一結點地址賦給前一結點地址
cout<<"成功刪除資料為"<<delData<<"的結點"<<endl;
n=n-1;
}
else
cout<<"要刪除的資料為"<<delData<<"的結點在連結串列中沒有找到"<<endl; //找不到該結點
return(head);
}
Ending!
更多課程知識學習記錄隨後再來吧!
就醬,嘎啦!
注:
人生在勤,不索何獲。
相關文章
- 單向連結串列————遍歷、查詢、插入結點 (基於C語言實現)C語言
- 雙向連結串列————查詢、刪除、插入結點
- 雙向迴圈連結串列————遍歷、查詢、插入結點
- 單向迴圈連結串列——查詢、刪除、插入結點
- 資料結構:單迴圈連結串列的建立插入與刪除資料結構
- c語言單連結串列的實現,包括連結串列的建立、插入、查詢、刪除、列印、長度計算C語言
- Java兩種方式實現連結串列的刪除,返回頭結點Java
- 資料結構 - 單連結串列 C++ 實現資料結構C++
- 資料結構——單連結串列的C++實現資料結構C++
- 資料結構__連結串列_單連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 結點插入到單連結串列中
- 【連結串列問題】刪除單連結串列的中間節點
- C++單連結串列遞迴遍歷操作C++遞迴
- 資料結構之單連結串列的建立與刪除資料結構
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- JZ-056-刪除連結串列中重複的結點
- 6-8 單連結串列結點刪除 (20 分)
- 資料結構_連結串列_雙向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構_連結串列_單向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 資料結構--單連結串列的建立和遍歷(程式碼優化)資料結構優化
- leetcode----刪除連結串列中的節點LeetCode
- 資料結構_連結串列_雙向迴圈連結串列 & 棧 的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 連結串列基礎2(超簡單)--單連結串列的插入和刪除
- 19. 刪除連結串列的倒數第 N 個結點
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- 雙向迴圈連結串列:(建立、插入、遍歷、求長、查詢、刪除、排序、銷燬)待測排序
- C語言實現帶表頭結點單連結串列的初始化、查詢、插入、刪除、輸出、撤銷等操作C語言
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- 6-C/C++實現資料結構連結串列相關操作C++資料結構
- C++資料結構連結串列的基本操作C++資料結構
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- “c語言+結構體+連結串列”實現名片系統C語言結構體
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 雙向連結串列 尾節點插入
- C++連結串列常見面試考點C++面試
- 資料結構實驗之連結串列一:順序建立連結串列資料結構
- 【C++ 資料結構:連結串列】二刷LeetCode707設計連結串列C++資料結構LeetCode