不带头结点的单链表,其算法步骤要分别考虑插入或删除的位置是第一个结点还是其他结点。
在删除和插入操作中,无论删除和插入的位置如何,带头结点的链表不需要修改头指针的值,而不带头结点的有时候需要。在清空操作中,带头结点的保留头结点,而不带头结点的要销毁。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
typedef struct LNode
{
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *linkList; //linkList为指向结构体LNode的指针类型
Status InitList(linkList &L) //初始化表头
{
L=NULL;
return OK;
}
Status DestroyList(linkList &L)
{
LNode*p;
while(L)
{
p=L;
L=L->next;
delete p;
}
return OK;
}
int ListLength(linkList L)//表长
{
LNode *p;
int j=0;
for(p=L;p;p=p->next)j++;
return j;
}
bool ListEmpty(linkList L) //判断空表
{
if(L==NULL) return 1;
return 0;
}
Status GetElem(linkList L, int i, ElemType &e) //链表的取值
{
int j=1;
LNode *p;
p=L;
while(p&&j<i){
j++;
p=p->next;
}
if(!p||j>i) return ERROR;
e=p->data;
return OK;
} //GetElem
int LocateElem(linkList L, int e) //略有改动 按值查找
{
int j=1;
LNode *p;
p=L;
while(p&&p->data!=e){
j++;
p=p->next;
}
if(!p)return ERROR;
return j;
} //LocateElem
Status ListInsert(linkList &L, int i, ElemType e) //单链表的插入
{
LNode *p,*s;
if(i==1)
{
s=new LNode;
s->data=e;
s->next=L;
L=s;
return OK;
}
else{
int j = 1;
p = L;
while (p && j < i - 1)
{
++j;
p = p->next;
} // 让p指向Ai-1位置
if (!p || j > i - 1)
return ERROR; // 非法
s = new LNode; // 生成新结点
s->data = e;
s->next = p->next;
p->next = s; // 插入
return OK;
}
} //ListInsert
Status ListDelete(linkList &L, int i) // 链表的删除
{
LNode *p,*q;
if(!L||i<1)return ERROR;
//删除表头
if(i==1&&L){
p=L;
L=L->next;
delete p;
return OK;
}
else{
int j = 1;
p = L;
while (p->next && j < i - 1)
{
p = p->next;
++j;
} // 让p指向Ai-1位置
if (!(p->next) || j > i - 1)
return ERROR; // 非法
q = p->next;
p->next = q->next;
delete q;
return OK;
}
} //ListDelete
void ListPrint(linkList L)
{
LNode *p;
for(p = L; p; p = p->next)
cout << p->data << (p->next ? ' ' : '\n');
}
int main()
{
int i;
ElemType e;
linkList L;
string op;
InitList(L);
while(cin >> op) {
if(op == "Empty")
cout << (ListEmpty(L) ? "Empty" : "Not empty") << endl;
else if(op == "Insert") {
cin >> i >> e;
if(ListInsert(L, i, e) == ERROR)
cout << "Insert failed" << endl;
else
ListPrint(L);
} else if(op == "Length") {
cout << "List length is " << ListLength(L) << endl;
} else if(op == "GetElem") {
cin >> i;
if(GetElem(L, i, e) == ERROR)
cout << "Out of index" << endl;
else
cout << "The elem at position " << i << " is " << e << endl;
} else if(op == "LocateElem") {
cin >> e;
i = LocateElem(L, e);
if(i == 0)
cout << e << " is not found in list" << endl;
else
cout << e << " is found at the position " << i << endl;
} else if(op == "Delete") {
cin >> i;
if(ListDelete(L, i) == ERROR)
cout << "Delete failed" << endl;
else
ListPrint(L);
}
}
DestroyList(L);
return 0;
}
带头结点的链表实现(C++)https://blog.csdn.net/Ruannn/article/details/129644250?spm=1001.2014.3001.5501