C++之一个程序学懂链表
来源:互联网 发布:如何查看电脑的端口号 编辑:程序博客网 时间:2024/06/05 12:02
本人最近正在学习数据结构,链表涉及较多,因此写了一个小程序帮助自己理解。代码注释较多,直接阅读难度应该不大,它涵盖了链表的读入、输出、反序、排序、插入、查找、删除等操作。大家若能读完、看懂,相信对单向链表掌握得已经不错了。希望能够帮到大家!
#include <bits/stdc++.h>
#define LEN sizeof(struct num)
int m;
using namespace std;
struct num
{
int n;
struct num *next;
};
//创立链表,读入数据
struct num *Create()
{
m = 0;
struct num *head; //头节点
struct num *p1 = NULL; //p1保存创建的新节点的地址
struct num *p2 = NULL; //p2保存原链表最后一个节点的地址
p1 = (struct num *) malloc (LEN);
p2 = p1;
if(p1==0) //若节点开辟不成功
{
printf ("\nCann't create it, try it again in a moment!\n");
return 0;
}
else //节点开辟成功
{
head = NULL; //开始head指向NULL
printf ("Please input %d node -- n: ", m + 1);
scanf ("%d", &(p1->n)); //录入数据
}
while(p1->n!=0)
{
m = m + 1;
if(m==1)
{
head = p1;
p2->next = NULL;
}
else
{
p2->next = p1;
}
p2=p1;
p1 = (struct num *)malloc(LEN);
cout<<"Please input "<<m+1<<" node -- n: ";
cin>>p1->n;
}
p2->next=NULL;
free(p1);
return head;
}
//遍历链表
void Print(num *head)
{
num *p = head;
cout<<"The numbers are: "<<endl;
while(p != NULL)
{
cout<<p->n<<endl;
p = p->next;
}
}
//按升序排序
struct num *Ascending(struct num *head)
{
cout<<"Ascending: "<<endl;
struct num *p = NULL;
int a[m+1], i;
p = head;
if(head!=NULL)
{
for(i = 0; i<m; i++)
{
a[i]=p->n;
p = p->next;
}
}
sort (a,a+m);//快速排序法
i = 0;
p = head;
while(i<m)
{
p->n = a[i];
p = p->next;
i++;
}
return head;
};
struct num *Insert(struct num *head)
{
struct num *p0, *p1, *p2;
p1 = head;
int n;
p2 = p1;
p0 = (struct num *)malloc(LEN);
cout<<"Please input the number you want to insert: ";
cin>>n;
p0->n = n;
while (p0->n > p1->n && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p0->n <= p1->n)
{
if (p1 == head)
{// 头部前段插入 p0和p1位置: p0->p1->...
p0->next = head;
head = p0;
}
else
{// 插入中间节点 p0,p1和p2位置: p2-> p0 -> p1
p0->next = p1;
p2->next = p0;
}
}
else
{ // 尾部插入节点 p0,p1和p2位置: p2->p1->p0->NULL
p1->next = p0;
p0->next = NULL;
}
return head;
}
//查找元素
void Search(struct num *head)
{
cout<<"Please input the number you want to search: "<<endl;
int n, flag = 0;
cin>>n;
struct num *p = NULL;
p = head;
do
{
if(p->n == n)
{
cout<<"Your number exsits. "<<endl;
flag = 1;
}
p = p->next;
}while(p!=NULL);
if(!flag) cout<<"Your number doesn't exsit. "<<endl;
};
//删除指定元素
struct num *Delete(struct num *head)
{
cout<<"Please input the number you want to delete: "<<endl;
int n, flag = 0;
cin>>n;
struct num *p2 = NULL;
struct num *p1 = NULL;
p2 = head;
while(p2!=NULL)
{
if(head->n == n)
{
head = p2->next;
flag = 1;
free(p2);
p2 = NULL;
break;
}
else if(p2->n == n)
{
p1->next = p2->next;
flag = 1;
free(p2);
p2 = NULL;
break;
}
p1 = p2;
p2 = p2->next;
}
if(flag==0)
cout<<"Your number doesn't exsit."<<endl;
m = m - 1;
return head;
};
//将链表逆序
struct num *Reverse (struct num *head)
{
struct num *p; //临时存储
struct num *p1; //存储返回结果
struct num *p2; //源结果节点一个一个取
p1 = NULL; //开始颠倒时,已颠倒的部分为空
p2 = head; //p2指向链表的头节点
while(p2 != NULL)
{
p = p2->next;
p2->next = p1;
p1 = p2;
p2 = p;
}
head = p1;
return head;
}
int main()
{
struct num *head;
head = Create();//创立链表,读入数据
Print(head);
Ascending(head);//按升序排序
Print(head);
Search(head);//查找指定元素
head = Delete(head);//删除指定元素
Print(head);
head = Insert(head);//插入指定元素
Print(head);
head = Reverse(head);//将链表逆序
Print(head);
}
- C++之一个程序学懂链表
- Linux编程之一:创建第一个C/C++程序
- 第一个IronPython程序(之一)
- C程序100实例之一
- 定点c程序之一:定标
- 50个java编程程序之一
- linux之一个简单的shell程序
- 第一个C程序
- 第一个C程序
- 第一个C程序
- 第一个C程序
- 第一个C程序
- 第一个c程序
- 第一个c程序
- 第一个c程序
- 第一个c程序
- 第一个C程序
- 第一个c程序
- 从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目
- MongoDB学习笔记:(2)、MongoDB主从复制
- 1212 无向图最小生成树
- 6.自己动手写Java Web框架-Model
- java中使用SAX生成XML文件
- C++之一个程序学懂链表
- 第四周项目3——单链表应用(1)
- JAVA进阶4.4——食品库存管理
- 存储班长信息的学生类
- Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作。
- Android 导航条效果实现(三) ViewPager+PagerTabStrip
- VC++编程过程中的一点杂记
- 前端学习------优先级和覆盖
- 警察和厨师-(1)