// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<vector>
#include<string>
#include<time.h>
#include<algorithm>
#include<ctime>
using namespace std;
typedef struct ListNode
{
int value;
ListNode* next;
}ListNode,LN;
void createList(LN* pHead,vector<int>& arr,int n)
{
LN* p = pHead;
for (int i = 0; i < n; i++)
{
LN* pNextNode = new LN;
pNextNode->value = arr.at(i);
pNextNode->next = NULL;
p->next = pNextNode;
p= pNextNode;
}
}
//输出链表的内容
void OutPutList(LN *head)
{
LN* current = head->next;
while (current != NULL)
{
cout << current->value << endl;
current = current->next;
}
cout << endl;
}
//在位置为i的节点插入值e
void insertNose(LN *head,int i,int e)
{
LN* temp;
temp = head;
int j = 0;
while (temp && j < i - 1) {
temp = temp->next;
j++;
}
if (!temp || j > i - 1) {
cout << "插入位置错误";
}
else {
LN* s;
s = new LN;
s->value = e;
s->next = temp->next;
temp->next = s;
}
}
//在节点a前面加入节点b,也可以是
void insertList(LN *head,int aData,int bData)
{
LN* p, * q = NULL, * s; //p指向a,q指向a前一个节点,s指向b
s = (LN*)new(LN);
s->value = bData;
p = head->next;
if (head->next == NULL)
{
head->next = s;
s->next = NULL;
}
else if (p->value == aData)
{
s->next = p;
head->next = s;
}
else
{
while (p->value != aData && p->next != NULL)
{
q = p;
p = p->next;
}
if (p->value == aData)
{
q->next = s;
s->next = p;
}
else
{
p->next = s;
s->next = NULL;
}
}
}
//删除节点i
void Delete(LN* head, int i)
{
LN* temp;
temp = head;
int j = 0;
while (temp && j < i - 1) {
temp = temp->next;
j++;
}
if (!temp || j > i - 1) {
cout << "删除位置错误";
return;
}
else {
LN* s;
s = temp->next;
temp->next = s->next;
delete s;
}
}
//删除倒数第i个节点
void Deletek(LN* head, int k)
{
LN* p = head->next;
LN* q = head->next;
int i = 1;
while (i <= k) { //注意是“<=”,为了让q指向倒数第k+1个,q->next为倒数第k个
i++;
p = p->next;
}
while (p->next != NULL) {
p = p->next;
q = q->next; //这时q指向倒数第k+1个,q->next为倒数第k个
}
LN* s;
s = q->next;
q->next = s->next;
delete s;
}
void DeleteList(LN *head, int aData)
{
LN* p, * q = NULL;
p = head->next;
if (p == NULL)
{
return;
}
if (p->value == aData)
{
head->next = p->next;
delete p;
}
else
{
while (p->value != aData && p->next != NULL)
{
q = p;
p = p->next;
}
if (p->value == aData)
{
q->next = p->next;
delete p;
}
}
}
//取得i节点的值
void GetData(LN* head, int i)
{
LN* temp;
temp = head;
int j = 0;
while (temp && j < i - 1) {
temp = temp->next;
j++;
}
if (!temp || j > i - 1) {
cout << "寻找位置错误" << endl;
return;
}
else {
cout << i << "处的数据为:" << temp->next->value << endl;
cout << temp->value << endl;
}
}
//取得倒数第k个的元素值
void GetDatak(LN* head, int k)
{
LN* p = head->next;
LN* q = head->next;
int i = 1;
while (i < k) {
i++;
p = p->next;
}
while (p->next != NULL) {
p = p->next;
q = q->next;
}
cout << "倒数第" << k << "个元素为:" << q->value << "\n";
cout << q->value << endl;
}
//
//修改i处的元素值
void ChangeData(LN *head,int i)
{
LN* temp;
temp = head;
int j = 0;
int x;
cout << "输入要修改的值:";
cin >> x;
while (temp && j < i - 1) {
temp = temp->next;
j++;
}
if (!temp || j > i - 1) {
cout << "寻找位置错误" << endl;
return ;
}
else {
temp->next->value = x;
cout << temp->next->value << endl;
}
}
//修改倒数第k个的元素值
void ChangeDatak(LN* head, int k)
{
LN* p = head->next;
LN* q = head->next;
int i = 1;
int x;
cout << "输入要修改的值:";
cin >> x;
while (i < k) {
i++;
p = p->next;
}
while (p->next != NULL) {
p = p->next;
q = q->next;
}
q->value = x;
cout << q->value << endl;
}
//寻找链表中有无与obj匹配的元素:第几个元素为obj
void Search(LN* head, int obj)
{
int j = 1;
LN* temp;
temp = head->next;
while (temp && temp->value != obj) {
temp = temp->next;
j++;
}
if (temp == NULL) {
cout << "该链表中无此元素" << endl;
return ;
}
else {
cout << "在该链表中的第" << j << "个元素等于" << obj << endl;
cout << j << endl;
}
}
//获得表的长度
void ListLength(LN* head)
{
LN* temp;
temp = head;
int j = 0;
while (temp) {
temp = temp->next;
j++;
}
cout << "该链表的长度为:" << j - 1 << endl;
cout << j << endl;
}
//链表倒置
LN* Reverse(LN* head)
{
LN* r;
LN* p = head->next;
head->next = NULL;
while (p != NULL) {
r = p->next;
p->next = head->next;
head->next = p;
p = r;
}
return head;
}
int main()
{
int n;
cout << "请输入需要排序的数字个数" << endl;
cin >> n;
vector<int> arr;
srand((int)time(NULL));
for (int i = 0; i < n; i++)
{
arr.push_back(rand() % 100);
}
clock_t startTime = clock();
LN* head = new LN;
head->value = 0;
head->next = NULL;
createList(head, arr, n);
clock_t endTime = clock();
cout << "整个程序用时:" << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
insertNose(head, 1, 20);
//cout << head->value << endl;
//cout << head->next->value << endl;
//cout << head->next->next->value << endl;
return 0;
}