链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
#include<iostream>
using namespace std;
typedef struct Node{
int data;
struct Node* pNext;
}NODE,*PNODE;
//创建链表函数
PNODE create_list(int len) {
PNODE phead = new NODE;
if (phead == NULL) {
exit(-1);
}
PNODE ptail = phead;
ptail->pNext = NULL;
cout << "请输入存储数据:" << endl;
for (int i = 0; i < len; i++) {
int a;
cin >> a;
PNODE pnew = new NODE;
if (NULL == pnew) {
exit(-1);
}
pnew->data = a;
ptail->pNext = pnew;
pnew->pNext = NULL;
ptail = pnew;
}
return phead;
}
//求链表的长度函数
int length_list(PNODE phead) {
PNODE p = phead->pNext;
int len = 0;
while (p != NULL) {
p = p->pNext;
len++;
}
return len;
}
//遍历链表函数
void traverse_list(PNODE phead) {
PNODE p = phead->pNext;
while (p != NULL) {
cout << p->data<<" ";
p = p->pNext;
}
cout << endl;
}
//链表排序函数
void sort_list(PNODE phead) {
int len = length_list(phead);
PNODE p,q;
int i, j;
for (p= phead->pNext, i = 0, p; i < len - 1; i++, p=p->pNext) {
for (j = 0, q = p->pNext; j < len - i - 1; q = q->pNext, j++) {
if (p->data > q->data) {
int temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
cout << endl;
}
//链表中插入数据函数
bool insert_list(PNODE phead, int pos, int val) {
PNODE p = phead;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->pNext;
i++;
}
if (p == NULL) {
return false;
}
PNODE pnew = new NODE;
if (pnew == NULL) {
cout << "动态内存分配失败" << endl;
exit(-1);
}
pnew->data = val;
PNODE q = p->pNext;
p->pNext=pnew;
pnew->pNext = q;
return true;
}
//链表中删除数据函数
bool delete_list(PNODE phead, int pos, int *val) {
PNODE p = phead;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->pNext;
i++;
}
if (p == NULL) {
return false;
}
PNODE q = p->pNext;
*val = q->data;
p->pNext = q->pNext;
delete q;
return true;
}
int main() {
int len;
cout << "输入构建链表的长度;" << endl;
cin >> len;
PNODE p = create_list(len);
cout << "您构建的链表为:"<< endl;
traverse_list(p);
int l = length_list(p);
//cout << "您构建的链表长度为:" <<l<< endl;
sort_list(p);
cout << "排序后的链表为:" << endl;
traverse_list(p);
insert_list(p, 5, 0);
cout << "在第五个位置插入数据0后的链表为:" << endl;
traverse_list(p);
int val;
delete_list(p, 2, &val);
cout << "删除第二个位置的数据后的链表为:" << endl;
cout << "删除第二个位置的数据为:" << val<<endl;
traverse_list(p);
sort_list(p);
cout << "重新对该链表进行排序得到链表为:" << endl;
traverse_list(p);
return 0;
}