基础数据结构【二】————动态数组,单向链表及链表的反转
生活随笔
收集整理的這篇文章主要介紹了
基础数据结构【二】————动态数组,单向链表及链表的反转
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ?DEMO1: ? ? 動態分配變量(鏈表,而靜態數組是線性表,意味著動態數組訪問和遍歷復雜度為O(n),而插入和刪除復雜度為O(1),而靜態數組線性表則完全相反)
int* intptr = new int(50); //聲明一指向整數的指針,在該內存中存入整數值50float* floatptr = new float; //聲明一指向浮點數的指針,但未指定內存中存儲的數據值cout << "intptr 指向的數據值:" << *intptr << "\n\n";*floatptr = 0.5;cout << "floatptr 指向的數據值:" << *floatptr << "\n\n";delete intptr;delete floatptr;int *ptr=new int[num]; // 動態分配數組為n個元素 delete [] ptr; // 釋放分配給 ptr 的內存空間
DEMO2: 動態數組求和示例
int main() {int no, count = 0, Total = 0; // 定義整數變量 count 與 Totalcout << "要輸入計算的個數為:";cin >> no;int* ptr = new int[no]; // 動態分配數組為n個元素 cout << endl;for (count = 0; count < no; count++){cout << "輸入ptr[" << count << "]:";cin >> ptr[count]; // 采用數組下標來輸入數組元素}for (count = 0; count < no; count++)Total += *(ptr + count); // 采用指針變量運算來存取數組的元素值cout << "---------------------------------------" << endl;cout << no << "個數的總和=" << Total; // 顯示結果cout << endl;delete[] ptr; // 釋放分配給 ptr 的內存空間ptr = NULL;system("pause");return 0;
}
DEMO3: 單向鏈表的創建與遍歷:
輸入12個學生的成績(形成列表并打印)
#include <iostream>
using namespace std;
class list //鏈表結構聲明
{
public:int num, score; //學號,得分char name[10]; //姓名class list* next; //指針變量,指向下一個節點
};
typedef class list node;
typedef node* link;int main()
{link newnode, ptr, delptr; //聲明三個鏈表結構的指針cout << "請輸入 5 位學生的數據:" << endl;delptr = new node; //delptr暫當鏈表頭指針if (!delptr){cout << "[Error!!內存分配失敗!]" << endl;exit(1);}cout << "請輸入座號:";cin >> delptr->num;cout << "請輸入姓名:";cin >> delptr->name;cout << "請輸入成績:";cin >> delptr->score;ptr = delptr; //保留鏈表頭指針,以ptr為指向當前節點的指針for (int i = 1; i < 5; i++){newnode = new node; //創建新節點if (!newnode){cout << "[Error!!內存分配失敗!" << endl;exit(1);}cout << "請輸入座號:";cin >> newnode->num;cout << "請輸入姓名:";cin >> newnode->name;cout << "請輸入成績:";cin >> newnode->score;newnode->next = NULL;ptr->next = newnode; //把新節點加在鏈表后面ptr = ptr->next; //讓ptr保持在鏈表的最后面}cout << "\n 學 生 成 績" << endl;cout << " 座號\t姓名\t成績\n=====================" << endl;ptr = delptr; //讓ptr回到鏈表頭while (ptr != NULL){cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score << endl;delptr = ptr;ptr = ptr->next; //ptr按序往后遍歷整個鏈表delete delptr; //釋放內存空間}system("pause");
}
? ? ? ? ptr = delptr; ? //保留鏈表頭指針,以ptr為指向當前節點的指針
? ? ? ? newnode->next = NULL;? ?
?? ??? ?ptr->next = newnode; //把新節點加在鏈表后面
?? ??? ?ptr = ptr->next; ? ? //讓ptr保持在鏈表的最后面?
step1:動態分配內存給新節點使用
step2:將原鏈表尾部的指針指向新元素所存在的位置(內存地址)
step3:將ptr指針指向新節點內存位置,表示這是新的鏈表尾部
step4:由于新的節點為當前鏈表的最后一個元素,所以將他的指針(next)指向NULL
?DEMO4:
輸入想刪除的成績(比如輸入76),就開始遍歷該鏈表,找到刪除(含有76)該學生的節點,然后提示,輸入新的成績,學號,姓名。結束的時候輸入 -1 ,即可輸出全部列表?
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include <iomanip> //操作符的頭文件
using namespace std;
class list
{
public:int num, score;char name[10];class list* next;//指向下一個節點
};
typedef class list node;//定義node為新的數據類型
typedef node* link; //定義link為新的數據類型指針 link findnode(link head, int num)
{link ptr;ptr = head;while (ptr != NULL){if (ptr->num == num)return ptr;ptr = ptr->next;}return ptr;
}link insertnode(link head, link ptr, int num, int score, char name[10])
{link InsertNode;InsertNode = new node;if (!InsertNode)return NULL;InsertNode->num = num;InsertNode->score = score;strcpy_s(InsertNode->name, name);InsertNode->next = NULL;if (ptr == NULL) //插入第一個節點{InsertNode->next = head;return InsertNode;}else{if (ptr->next == NULL)//插入最后一個節點{ptr->next = InsertNode;}else //插入中間節點{InsertNode->next = ptr->next;ptr->next = InsertNode;}}return head;
}int main()
{link head, ptr, newnode;int new_num, new_score;char new_name[10];int i, j, position = 0, find, data[12][2];char namedata[12][10] = { {"Allen"},{"Scott"},{"Marry"},{"John"},{"Mark"},{"Ricky"},{"Lisa"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"} };srand((unsigned)time(NULL));cout << "座號 成績 座號 成績 座號 成績 座號 成績" << endl;cout << "==============================================" << endl;for (i = 0; i < 12; i++){data[i][0] = i + 1;//座號data[i][1] = rand() % 50 + 51;//成績}for (i = 0; i < 3; i++){for (j = 0; j < 4; j++)cout << "[" << data[j * 3 + i][0] << "] [" << data[j * 3 + i][1] << "] ";cout << endl;}head = new node; //建立鏈表頭指針if (!head){cout << "Error!! 內存分配失敗!!" << endl;exit(1);}head->num = data[0][0];for (j = 0; j < 10; j++)head->name[j] = namedata[0][j];head->score = data[0][1];head->next = NULL;ptr = head;for (i = 1; i < 12; i++) //建立鏈表{newnode = (link)malloc(sizeof(node));newnode->num = data[i][0];for (j = 0; j < 10; j++)newnode->name[j] = namedata[i][j];newnode->score = data[i][1];newnode->next = NULL;ptr->next = newnode;ptr = ptr->next;}while (1){cout << "請輸入要插入其后的學生編號,結束輸入-1:";cin >> position;if (position == -1)//循環中斷條件break;else{ptr = findnode(head, position);cout << "請輸入新插入的學生編號:";cin >> new_num;cout << "請輸入新插入的學生成績:";cin >> new_score;cout << "請輸入新插入的學生姓名:";cin >> new_name;head = insertnode(head, ptr, new_num, new_score, new_name);}}ptr = head;cout << "\n\t座號\t 姓名\t成績\n";cout << "\t==============================\n";while (ptr != NULL){cout << "\t[" << ptr->num << "]\t[ " << ptr->name << "]" << setw(6) << "\t[" << ptr->score << "]\n";ptr = ptr->next;}delete head;system("pause");return 0;
}
?DEMO5:?刪除鏈表節點
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib> //使用隨機數的頭文件
using namespace std;
class list
{public:int num,score;char name[10];class list *next;
};
list del_ptr(list *head,list *ptr);
int main()
{ list *ptr;int findword=0,find,data[12][2];char namedata[12][10]={{"Allen"},{"Moko"},{"Lean"},{"Melissa"},{"Angel"},{"Sabrina"},{"Joyce"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"}};srand((unsigned)time(NULL));//以時間為隨機數的種子cout<<"座號 成績 座號 成績 座號 成績 座號 成績"<<endl;cout<<"=============================================="<<endl;for(int i=0;i<12;i++){ data[i][0]=i+1;data[i][1]=rand()%50+51;}for(int i=0;i<3;i++){ for (int j=0;j<4;j++)cout<<"["<<data[j*3+i][0]<<"] ["<<data[j*3+i][1]<<"] ";cout<<endl;}list *head=new list;//建立鏈表頭指針if(!head){ cout<<"Error!! 內存分配失敗!!"<<endl;exit(1);}head->num=data[0][0];for (int j=0;j<10;j++)head->name[j]=namedata[0][j];head->score=data[0][1];head->next=NULL;ptr=head;for(int i=1;i<12;i++) { list *newnode=new list;//建立鏈表newnode->num=data[i][0];for (int j=0;j<10;j++)newnode->name[j]=namedata[i][j];newnode->score=data[i][1];newnode->next=NULL;ptr->next=newnode;ptr=ptr->next;}while(1){ cout<<"請輸入要刪除的成績,結束輸入-1:";cin>>findword;if(findword==-1)//循環中斷條件break;else{ ptr=head;find=0;while (ptr!=NULL){ if(ptr->score==findword) { *ptr=del_ptr(head,ptr);//刪除數據find++;}ptr=ptr->next;}if(find==0)cout<<"######沒有找到######"<<endl;}}ptr=head;cout<<"\n\t座號\t 姓名\t成績"<<endl; //輸出剩余鏈表中的數據cout<<"\t=============================="<<endl;while(ptr!=NULL){ cout<<"\t["<<ptr->num<<"]\t["<<setw(10)<<ptr->name<<"]\t["<<ptr->score<<"]"<<endl;ptr=ptr->next;}system("pause");
}
list del_ptr(list *head,list *ptr)//刪除節點子程序
{ list *top;top=head;if(ptr==head)//[情形1]:刪除節點在鏈表頭部{ head=head->next;cout<<"已刪除第 "<<ptr->num<<" 號學生!!姓名: "<<ptr->name<<endl;}else{ while(top->next!=ptr)//找到刪除節點的前一個位置top=top->next;if(ptr->next==NULL) //[情形2]:刪除節點在鏈表尾部{ top->next=NULL;cout<<"已刪除第 "<<ptr->num<<" 號學生!!姓名: "<<ptr->name<<endl;}else //[情形3]:刪除節點在鏈表中間的任一節點{ top->next=ptr->next;cout<<"已刪除第 "<<ptr->num<<" 號學生!!姓名: "<<ptr->name<<endl;}}delete []ptr; //釋放內存空間return *head; //返回鏈表
}
?
??DEMO6:將學生成績按座號反轉打印出來,單鏈鏈表反轉
/*
[名稱]:ch03_06.cpp
[示范]:將學生成績按座號反轉打印出來
*/
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std;
class list
{public:int num,score;char name[10];class list *next;
};
typedef class list node;
typedef node *link;
int main()
{ link ptr,last,before;int i,j,findword=0,data[12][2];char namedata[12][10]={{"Allen"},{"Mako"},{"Lean"},{"Melissa"},{"Angel"},{"Sabrina"},{"Joyce"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"}};srand((unsigned)time(NULL));for (i=0;i<12;i++){ data[i][0]=i+1;data[i][1]=rand()%50+51;}link head=new node;//建立鏈表頭指針if(!head){ cout<<"Error!! 內存分配失敗!!"<<endl;exit(1);}head->num=data[0][0];for (j=0;j<10;j++)head->name[j]=namedata[0][j];head->score=data[0][1];head->next=NULL;ptr=head;for(i=1;i<12;i++) //建立鏈表{ link newnode=new node;newnode->num=data[i][0];for (j=0;j<10;j++)newnode->name[j]=namedata[i][j];newnode->score=data[i][1];newnode->next=NULL;ptr->next=newnode;ptr=ptr->next;}ptr=head;i=0;cout<<"原始鏈表數據:"<<endl; while (ptr!=NULL) { //打印鏈表數據cout<<"["<<setw(2)<<ptr->num<<setw(8)<<ptr->name<<setw(3)<<ptr->score<<"] -> ";i++;if(i>=3) //三個元素為一行{ cout<<endl;i=0;}ptr=ptr->next;}ptr=head;before=NULL;cout<<"\n反轉后鏈表數據:"<<endl; while(ptr!=NULL) //鏈表反轉{ last=before;before=ptr;ptr=ptr->next;before->next=last;}ptr=before;while(ptr!=NULL){ cout<<"["<<setw(2)<<ptr->num<<setw(8)<<ptr->name<<setw(3)<<ptr->score<<"] -> ";i++;if(i>=3){ cout<<endl;i=0;}ptr=ptr->next;}system("pause");
}
?
DEMO7:?單向鏈表連接功能
/*
[名稱]:ch03_07.cpp
[示范]:單向鏈表的連接功能
*/
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class list
{
public:int num, score;char name[10];class list* next;
};
typedef struct list node;
typedef node* link;
link concatlist(link, link);int main()
{link head, ptr, newnode, last, before;link head1, head2;int i, j, findword = 0, data[12][2];//第一組鏈表的姓名 char namedata1[12][10] = { {"Allen"},{"Scott"},{"Marry"},{"Jon"},{"Mark"},{"Ricky"},{"Lisa"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"} };//第二組鏈表的姓名char namedata2[12][10] = { {"May"},{"John"},{"Michael"},{"Andy"},{"Tom"},{"Jane"},{"Yoko"},{"Axel"},{"Alex"},{"Judy"},{"Kelly"},{"Lucy"} };srand((unsigned)time(NULL));for (i = 0; i < 12; i++){data[i][0] = i + 1;data[i][1] = rand() % 50 + 51;}head1 = new node; //建立第一組鏈表的頭指針if (!head1){cout << "Error!! 內存分配失敗!!" << endl;exit(1);}head1->num = data[0][0];for (j = 0; j < 10; j++)head1->name[j] = namedata1[0][j];head1->score = data[0][1];head1->next = NULL;ptr = head1;for (i = 1; i < 12; i++)//建立第一組鏈表{newnode = new node;newnode->num = data[i][0];for (j = 0; j < 10; j++)newnode->name[j] = namedata1[i][j];newnode->score = data[i][1];newnode->next = NULL;ptr->next = newnode;ptr = ptr->next;}srand((unsigned)time(NULL));for (i = 0; i < 12; i++){data[i][0] = i + 13;data[i][1] = rand() % 40 + 41;}head2 = new node; //建立第二組鏈表的頭指針if (!head2){cout << "Error!! 內存分配失敗!!\n";exit(1);}head2->num = data[0][0];for (j = 0; j < 10; j++)head2->name[j] = namedata2[0][j];head2->score = data[0][1];head2->next = NULL;ptr = head2;for (i = 1; i < 12; i++)//建立第二組鏈表{newnode = new node;newnode->num = data[i][0];for (j = 0; j < 10; j++)newnode->name[j] = namedata2[i][j];newnode->score = data[i][1];newnode->next = NULL;ptr->next = newnode;ptr = ptr->next;}i = 0;ptr = concatlist(head1, head2);//將鏈表相連接cout << "兩個鏈表相連接的結果:" << endl;while (ptr != NULL){ //輸出鏈表數據cout << "[" << ptr->num << " " << ptr->name << " " << ptr->score << " ]\t-> ";i++;if (i >= 3)//三個元素為一行{cout << endl;i = 0;}ptr = ptr->next;}delete newnode;delete head2;system("pause");return 0;
}
link concatlist(link ptr1, link ptr2)
{link ptr;ptr = ptr1;while (ptr->next != NULL)ptr = ptr->next;ptr->next = ptr2;return ptr1;
}
?
?
?
總結
以上是生活随笔為你收集整理的基础数据结构【二】————动态数组,单向链表及链表的反转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基础数据结构【一】————数组
- 下一篇: 基础数据结构【三】————老鼠走迷宫问题