C++单链表的操作(创建,删除,打印,遍历,插入)
2014-06-26 12:32
806 查看
其实C++中单链表中对数据的操作很好理解的,只要熟悉这个过程 头结点与中介结点的连接,以及中介结点与下一结点的连接,并把它带到下一次循环中,就创建成功了。而删除操作就更简单了,只需要使删除结点的前一结点的next域指向下一结点,在delet释放内存空间,就删除成功了,接下来遍历创建新结点都是一个原理,并不难理解
下面是我的实验代码:建立一个单链表 21 23 25 27 29 31,并输出该链表;
进行输入操作查找为n的结点,并输出;
进行输入X值查找为X的结点,并输出;
输入入序号N和值X,在序号N结点后插入,并输出链表;
删除结点,删除序号为N的结点。
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#define N 6
using namespace std;
struct node{
int data; node *next;
};
node *Create(node *head);
void print(node *h);
node *find_data(node *head, int i);
int find_node(node *head, int x);
node *inset_node(node *head,int n, int x);
void insert_list(node *head, int n, int x);
void deleta_list(node *head, int n);
int main()
{
node *list; int n; int x;
list = NULL;
//cout << "请输入链表的长度:" << endl;
list = Create(list);
print(list);
cout << "请输入查找的序号:";
cin >> n;
cout << "输出值:"<< find_data(list, n)->data << endl;
cout << "请输入值:";
cin >> x;
if(find_node(list, x))
cout << "输出序号:" << find_node(list, x) << endl;
else cout << "没有这个值!" << endl;
insert_list(list, n, x);
cout << "输出链表:";
print(list);
cout << "删除结点:"; cin >> n;
deleta_list(list,n);
cout << "输出链表:";
print(list);
}
node *Create(node *head)
{
node *last, *p = NULL;
head = (node*)malloc(sizeof(node));//建立为表头结点
head->next = NULL;//将next域置空
last = head;//last为指向尾节点的指针
int k = 21;
for (int i = 0; i < N; i++)
{
p = (node*)malloc(sizeof(node));
//p->next = NULL;
p->data=k;
last->next = p;//last->p head->last last->p
last = p;//为下一次循环做准备
//p = p->next;
p->next = NULL;
k += 2;
}
return head;
}
void print(node *head)
{
const node *p;
p = head;
p = p->next;
while (p != NULL)
{
cout << p->data << "->";
p = p->next;
}
cout << endl;
}
node *find_data(node *head, int i)
{
node *p = head;
int j=0;
if (i <= 0)return NULL;
while (j < i)
{
p = p->next;
j++;
}
return p;
}
int find_node(node *head, int x)
{
node *p = head;
int j = 0;
while (p->next)
{
p = p->next;
j++;
if (p->data == x)
return j;
}
return 0;
}
void insert_list(node *head, int n, int x)
{
int i = 0;
node *p = head, *pNew,*q;
cout << "插入结点:";
cin >> n >> x;
while (NULL != p && i<n)//找出这个结点的位置
{
p = p->next;
++i;
}
pNew= (node*)malloc(sizeof(node));
pNew->data = x; //给新节点的数据域赋值
//p->next = pNew;
q = p->next;//讲p->next赋值给q 即声明q为p的后一结点
p->next = pNew;//将pnew的地址赋值给P的next域 即p指向pNew
pNew->next = q; // pNew = q;这里是更新新节点的指针域
}
void deleta_list(node *head, int n)
{
int i = 0;
node *p = head, *pdel,*q;
while (p != NULL&&i < n-1)
{
p = p->next;
i++;
}
pdel = p->next;
q = pdel->next;
p->next = q;
delete(pdel);
}
下面是我的实验代码:建立一个单链表 21 23 25 27 29 31,并输出该链表;
进行输入操作查找为n的结点,并输出;
进行输入X值查找为X的结点,并输出;
输入入序号N和值X,在序号N结点后插入,并输出链表;
删除结点,删除序号为N的结点。
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#define N 6
using namespace std;
struct node{
int data; node *next;
};
node *Create(node *head);
void print(node *h);
node *find_data(node *head, int i);
int find_node(node *head, int x);
node *inset_node(node *head,int n, int x);
void insert_list(node *head, int n, int x);
void deleta_list(node *head, int n);
int main()
{
node *list; int n; int x;
list = NULL;
//cout << "请输入链表的长度:" << endl;
list = Create(list);
print(list);
cout << "请输入查找的序号:";
cin >> n;
cout << "输出值:"<< find_data(list, n)->data << endl;
cout << "请输入值:";
cin >> x;
if(find_node(list, x))
cout << "输出序号:" << find_node(list, x) << endl;
else cout << "没有这个值!" << endl;
insert_list(list, n, x);
cout << "输出链表:";
print(list);
cout << "删除结点:"; cin >> n;
deleta_list(list,n);
cout << "输出链表:";
print(list);
}
node *Create(node *head)
{
node *last, *p = NULL;
head = (node*)malloc(sizeof(node));//建立为表头结点
head->next = NULL;//将next域置空
last = head;//last为指向尾节点的指针
int k = 21;
for (int i = 0; i < N; i++)
{
p = (node*)malloc(sizeof(node));
//p->next = NULL;
p->data=k;
last->next = p;//last->p head->last last->p
last = p;//为下一次循环做准备
//p = p->next;
p->next = NULL;
k += 2;
}
return head;
}
void print(node *head)
{
const node *p;
p = head;
p = p->next;
while (p != NULL)
{
cout << p->data << "->";
p = p->next;
}
cout << endl;
}
node *find_data(node *head, int i)
{
node *p = head;
int j=0;
if (i <= 0)return NULL;
while (j < i)
{
p = p->next;
j++;
}
return p;
}
int find_node(node *head, int x)
{
node *p = head;
int j = 0;
while (p->next)
{
p = p->next;
j++;
if (p->data == x)
return j;
}
return 0;
}
void insert_list(node *head, int n, int x)
{
int i = 0;
node *p = head, *pNew,*q;
cout << "插入结点:";
cin >> n >> x;
while (NULL != p && i<n)//找出这个结点的位置
{
p = p->next;
++i;
}
pNew= (node*)malloc(sizeof(node));
pNew->data = x; //给新节点的数据域赋值
//p->next = pNew;
q = p->next;//讲p->next赋值给q 即声明q为p的后一结点
p->next = pNew;//将pnew的地址赋值给P的next域 即p指向pNew
pNew->next = q; // pNew = q;这里是更新新节点的指针域
}
void deleta_list(node *head, int n)
{
int i = 0;
node *p = head, *pdel,*q;
while (p != NULL&&i < n-1)
{
p = p->next;
i++;
}
pdel = p->next;
q = pdel->next;
p->next = q;
delete(pdel);
}
相关文章推荐
- 单链表的基本操作(创建、删除、插入、遍历)
- 单链表的创建删除排序插入逆向打印各种操作
- C++实现单链表的创建、插入、删除、逆置操作
- c++实现单链表创建,删除,遍历,插入,修改操作
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- 数据结构——单链表的创建、删除、遍历以及节点的插入、删除等操作
- 单链表创建-遍历-排序-插入-删除-逆序操作
- c/c++ 单链表 创建 插入 删除 翻转 打印
- C++单链表的动态创建,查找,遍历,删除,插入,添加,排序
- C++ 单链表的建立,插入数值,删除数值,排序,遍历,和分割操作
- 单链表的创建、计数打印、删除与插入操作
- C++单链表的创建插入删除以及逆序操作
- 单链表的常用操作,包括单链表的创建、插入、删除、排序、逆置以及打印输出等
- 单链表操作,创建,遍历,插入,删除,排序等操作
- 不疯魔,不成活!——单链表的创建,插入,删除等操作
- 单链表-创建、插入、删除、查找、反转等操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- C-链表的一些基本操作【创建-删除-打印-插入】
- 关于单链表的各种函数的C++源代码,创建单链表、求表长、插入、删除等等
- 单链表的创建、插入、删除等操作