目录
1、声明结构体
结构体内声明一个存储数据的data;
然后声明一个指针;
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Node LinkList;
2、创建链表(尾插法)
LinkList * CreateList(int n ,LinkList *L) { //尾插法创建链表
LinkList *p , *r; //r为节点最终的指针,p为接收的节点
int i,k ;
L= (Node * ) malloc(sizeof(Node));//为整个链表
(L)->next = NULL;
r= L; //r为指向尾部的节点
cout << "请输入数值" << endl;
for(i = 0 ; i < n; i++ ){
cout << "输入对应数值" << endl;
cin >> k; //输入数值
p = (Node*) malloc(sizeof(Node)); //生成新节点
p -> data = k; //将数值赋值入p
r->next = p; //将表尾终端节点的指针指向新节点
r = p;//将当前的新节点定义为表尾终端节点
p->Length++;
}
// delete L;
r -> next = NULL; //表示当前链表结束
return L;
}
3、显示链表
void show(LinkList * L) { //打印整个链表
LinkList *p = L->next;
cout << "打印节点" << endl;
while (p != NULL) {
cout << p->data << endl;
p = p->next;
}
}
4、插入元素
int ListInsert(LinkList *L , int i , ElemType e){ //在L中第i个位置之前插入新的数据元素e ,L的长度加1
int j;
LinkList *p , *s;
p = L;
j = 1;
while (p && j < i){ //寻找第i个节点
p = p -> next;
++j;
p->Length++;
}
if(!p || j > i){
return ERROR; //第i个元素不存在
}
s = (LinkList*) malloc(sizeof(Node)); //生成新节点
s->data = e; //将e的数据加入s中
s->next = p -> next; //将p的后继赋值给s的后继
p->next = s; //将s赋值给p的后继
}
5、读取表中特点位置的元素
int GetElem(LinkList *L , int i, ElemType *e){ //读取单链表中第i个值
int j;
LinkList *p; //声明一节点p
p = L-> next; //让p指向L的第一个节点
j = 1; //j为计数器
while (p && j < i){ //p不为空 或者计数器j还没有等于i时,循环继续
p = p ->next; //让p指向下一个节点
++j;
}
if(!p || j > i){ //如果p为空,或者j大于i时,循环结束
return ERROR; //i元素不存在
}
*e = p->data; //取第i个元素的数据
cout << "你要查找的数是" << *e << endl;
return OK;
}
6、清空链表
int ClearList(LinkList *L) { //将L重置为空表
LinkList *p, *q;
p = (L)->next; //*p指向第一个节点
while (p) { //没到表尾
q = p->next;
free(p);
p = q;
}
(L)->next = NULL; //头指针指针域为空
return OK;
}
7、退出程序
cout << "退出程序" << endl;
free(L);
return 0;
整段代码
#include <iostream>
using namespace std;
#include <string>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Node LinkList;
int GetElem(LinkList *L , int i, ElemType *e){ //读取单链表中第i个值
int j;
LinkList *p; //声明一节点p
p = L-> next; //让p指向L的第一个节点
j = 1; //j为计数器
while (p && j < i){ //p不为空 或者计数器j还没有等于i时,循环继续
p = p ->next; //让p指向下一个节点
++j;
}
if(!p || j > i){ //如果p为空,或者j大于i时,循环结束
return ERROR; //i元素不存在
}
*e = p->data; //取第i个元素的数据
cout << "你要查找的数是" << *e << endl;
return OK;
}
int ListInsert(LinkList *L , int i , ElemType e){ //在L中第i个位置之前插入新的数据元素e ,L的长度加1
int j;
LinkList *p , *s;
p = L;
j = 1;
while (p && j < i){ //寻找第i个节点
p = p -> next;
++j;
p->Length++;
}
if(!p || j > i){
return ERROR; //第i个元素不存在
}
s = (LinkList*) malloc(sizeof(Node)); //生成新节点
s->data = e; //将e的数据加入s中
s->next = p -> next; //将p的后继赋值给s的后继
p->next = s; //将s赋值给p的后继
}
int DaleteList(LinkList *L , int i , ElemType *e){ //删除第i个元素,L的长度减1
int j;
LinkList *p , *q;
p = L;
j = 1;
while(p && j < i){ //寻找第i个节点
p = p->next;
++j;
}
if(!p || j > i){
return ERROR; //第i个元素不存在
}
q = p->next; //将p的后继赋值给q
p ->next = p->next->next; //将q的后继赋值给p的后继,相当于p->next->next
*e = q->data; //将d的data赋值给e
free(q); //释放节点q
return OK;
}
LinkList * CreateList(int n ,LinkList *L) { //尾插法创建链表
LinkList *p , *r; //r为节点最终的指针,p为接收的节点
int i,k ;
L= (Node * ) malloc(sizeof(Node));//为整个链表
(L)->next = NULL;
r= L; //r为指向尾部的节点
cout << "请输入数值" << endl;
for(i = 0 ; i < n; i++ ){
cout << "输入对应数值" << endl;
cin >> k; //输入数值
p = (Node*) malloc(sizeof(Node)); //生成新节点
p -> data = k; //将数值赋值入p
r->next = p; //将表尾终端节点的指针指向新节点
r = p;//将当前的新节点定义为表尾终端节点
p->Length++;
}
r -> next = NULL; //表示当前链表结束
return L;
}
void show(LinkList * L) { //打印整个链表
LinkList *p = L->next;
cout << "打印节点" << endl;
while (p != NULL) {
cout << p->data << endl;
p = p->next;
}
}
int ClearList(LinkList *L) { //将L重置为空表
LinkList *p, *q;
p = (L)->next; //*p指向第一个节点
while (p) { //没到表尾
q = p->next;
free(p);
p = q;
}
(L)->next = NULL; //头指针指针域为空
return OK;
}
int main() {
LinkList *L;
int n , i ,e , w , o;
while(-1) {
cout << "请选择需要的功能" << endl;
cout << "1---创建链表" << endl;
cout << "2---显示链表" << endl;
cout << "3---插入元素" << endl;
cout << "4---查询元素" << endl;
cout << "5---删除元素" << endl;
cout << "6---清空链表" << endl;
cout << "7---退出程序" << endl;
cin >> n;
switch (n) {
case 1:
cout << "你选择的创建链表" << endl;
cout << "需要几个" << endl;
cin >> i;
L = CreateList(i, L);
cout << "链表已建立" << endl;
break;
case 2:
cout << "你选择了显示链表" << endl;
show(L);
cout << "已显示完成" << endl;
break;
case 3:
cout << "你选择了修改链表" << endl;
cout << "请输入要插入的元素的位置" << endl;
cin >> w;
cout << "请输入要插入的元素" << endl;
cin >> e;
ListInsert(L , w , e);
cout << "修改完成" << endl;
break;
case 4:
cout << "你选择了查询元素" << endl;
cin >> i;
GetElem(L , i, &e);
break;
case 5:
cout << "你选择了第 " << i << "删除元素" << endl;
cin >> i;
DaleteList(L , i , &e);
cout << "删除成功" << endl;
break;
case 6:
cout << "你选择了清空列表" << endl;
cout << "1---请问确定要删除吗" << endl;
cout << "2---返回 " << endl;
cin>>i;
if(i == 1) {
ClearList(L);
cout << "清空完成" << endl;
break;
}else{
break;
}
case 7:
cout << "退出程序" << endl;
free(L);
return 0;
}
}
}