前言
这部分代码还有一点地方不完善,没有考虑到操作链表中第一个元素的情况,有想法的可以自己修改,其实都差不多的。
代码
#define ElemType int
#define Status int
#define OK 0
#define OVERFLOW -1
#define ERROR -1
using namespace std;
#include<bits/stdc++.h>
//单链表的结构体定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//初始化
Status InitList(LinkList &L) {
L = new LNode;
L->next = L; //指针域指向头节点
cout << "初始化成功!";
return OK;
}
//链表的插入数据
Status ListInsert(LinkList &L,int i,ElemType e) {
LNode *p=L;
for(int j =0;j<(i) && (p->next != L) ;j++){
p=p->next;
}
if(p==L) return ERROR;
LNode *s = new LNode;
s->next=p->next;
s->data=e;
p->next=s;
return OK;
}
//取第i项的值 通过e返回
Status GetElem(LinkList L,int i,ElemType &e){
LNode *p = L->next;
for(int j =0;j<i && p->next!=L;j++){
p = p->next;
}
if(p==L) return ERROR;
e = p->data;
return OK;
}
//返回的是目标元素的指针 按值查找
LNode *LocateElem(LinkList L,ElemType e){
LNode *p = L->next;
while(p!=L && p->data!=e){
p=p->next;
}
return p;
}
//展示数据
void showData(LinkList L) {
LNode *p = L->next;
while(p!=L){
cout << p->data;
p=p->next;
}
cout<<"\n";
}
// 删除数据
Status ListDelete(LinkList &L,int i) {
LinkList p, q;
int j;
p = L;
j = 0;
while ((p->next!=L) && (j < i)) //查找第i?1个结点,p指向该结点
{
p = p->next;
++j;
}
if ((p==L) || (j > i ))
return ERROR; //当i>n或i<1时,删除位置不合理
q = p->next; //临时保存被删结点的地址以备释放
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放删除结点的空间
return OK;
}
//后插法 比如建立的链表为a b c d 那么输入顺序就是 a b c d
Status CreateList_R(LinkList &L,int n) {
L = new LNode;
L->next =NULL;
LNode *r = L; //中间变量指针,用于存储最后一个节点的地址位置 初始化创建的时候默认头节点的地址为尾指针的地址
for(int i = 0;i<n;i++){
LNode *p = new LNode; //生成新节点
cin >> p->data; // 存入数据
p->next=L; //设置下一跳为空
r->next =p; //设置尾指针指向最后一个节点
r= p; // r的地址为p的地址 这里存储的是地址!!!!!!!!!!
/*
C语言中指针间的等于号"="是把一个指针的地址赋予个另外一个指针!!!
*/
}
}
int main() {
//初始化链表
int count = 5;
LinkList list;
CreateList_R(list,count);
showData(list);
//插入数据
cout << "在下标1插入9" << endl;
ListInsert(list,1,9) ;
showData(list);
//根据下标获取数据
cout << "获取下标为2的数据" << endl;
ElemType data = -1;
GetElem(list,2,data);
cout << data << endl;
//根据元素值获取指针节点
cout << "获取元素1的指针" << endl;
LNode *dataNode = LocateElem(list,1) ;
cout << dataNode->data << endl;
//根据下标删除数据
cout << "删掉下标1的数据" << endl;
ListDelete(list,1) ;
showData(list);
return 0;
}
截图
版权属于:本文为原创文章,版权归 猫先生 所有
本文链接:https://loli.rip/index.php/archives/199/
转载时须注明出处及本声明