日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

基础数据结构【二】————动态数组,单向链表及链表的反转

發布時間:2023/11/27 生活经验 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础数据结构【二】————动态数组,单向链表及链表的反转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?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;
}

?

?

?

總結

以上是生活随笔為你收集整理的基础数据结构【二】————动态数组,单向链表及链表的反转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。