【資料結構】c++ 實現連結串列的建立,查詢,列印,刪除,插入
//程式很簡單,但是要捋順邏輯關係,留著備用
#include
#include"stdafx.h"
using namespace std;
struct node
{
int data;
node* next;
};
node * created_head(node *head)
{
node * temp;
for (int i = 1; i < 10; i++)
{
temp = new node;
temp->data = i;
temp->next = head->next;
head->next = temp;
}
return head;
}
node * created_rear(node *head)
{
node *p2;
p2 = new node;
p2 = head; //保持頭節點
node * temp;
for (int i = 1; i < 10; i++)
{
temp = new node;//定義一個終端節點
temp->data = i;
//temp->next = p->next;
p2->next = temp;
temp->next = NULL;
p2 = temp;
}
return head;
}
//列印連結串列
void print_list(node *head)
{
node *temp;
temp = new node;
temp = head;
while (temp->next != NULL)
{
temp = temp->next;
cout << temp->data << " ";
}
cout << endl;
}
//獲取連結串列長度
int leng_list(node *head)
{
node *temp;
temp = new node;
temp = head;
int leng = 0;
while (temp->next != NULL)
{
temp = temp->next;
leng++;
}
return leng;
}
//獲取連結串列第i個節點
node * get_list(node * head, int i)
{
node *temp;
temp = new node;
temp = head;
bool state = false;
int j = 1;
while (temp->next != NULL)
{
temp = temp->next;
if (j == i)
{
state =true;
break;
}
j++;
}
if (state == true)
{
cout << "索引成功" << endl;
return temp;
}
else//兩種情況, 頭指標或者,超過了連結串列的最大區間
{
cout << "超出索引範圍,返回頭結點" << endl;
return head;
}
}
//在連結串列head中第i個位置後插入節點insert
void insert_list(node *head, int i, node * insert)
{
node *temp;
temp = new node;
int leng;
leng = leng_list(head);
if ((i > 0) && (i <= leng))
{
temp = get_list(head, i);
insert->next = temp->next;
temp->next = insert;
}
else
{
cout << "超出連結串列範圍無法插入" << endl;
}
}
//刪除連結串列head第i個節點
void delete_list(node *head, int i)
{
node *temp;
temp = new node;
node *dele;
dele = new node;
int leng;
leng = leng_list(head);
if ((i > 0) && (i <= leng))
{
temp = get_list(head, i-1);
dele = temp->next;
temp->next = dele->next;
delete dele;
}
else
{
cout << "超出連結串列範圍無法刪除" << endl;
}
}
void main()
{
node *head1;
node *head2;
head1 = new node;
head2 = new node;
head1->next = NULL;
head2->next = NULL;
cout << "***************" << "頭插法新建連結串列head1" << "***************" << endl;
created_head(head1);
print_list(head1);
cout << "***************" << "尾插法新建連結串列head2" << "***************" << endl;
created_rear(head2);
print_list(head2);
cout << endl;
cout << "***************" << "連結串列head1 長度" << "***************" << endl;
cout << leng_list(head1) << endl;
cout << "***************" << "連結串列head1 第五個節點" << "***************" << endl;
cout << get_list(head1, 5)->data << endl;
node * insert;
insert = new node;
insert->data = 21;
cout << "***************" << "head1在第2節點後插入節點insert->data = 21" << "***************" << endl;
insert_list(head1,2 , insert);
print_list(head1);
cout << "***************" << "當前連結串列head1的長度" << "***************" << endl;
cout << leng_list(head1) << endl;
cout << "***************" << "刪除head1的第5個元素" << "***************" << endl;
delete_list(head1, 5);
print_list(head1);
cout << "***************" << "刪除後head1的長度" << "***************" << endl;
cout << leng_list(head1) << endl;
}