#include <stdlib.h>
#include <iostream>
using namespace std;
//顺序表的定义
#define InitSize 10
typedef struct{
int element[InitSize];
int length;
} SqList0;
//静态分配
void initList0(SqList0& l){
l.length=0;
}
typedef struct{
int* element;
int MaxSize;
int length;
} SqList1;
//动态分配
void initList1(SqList1& l){
l.element=(int*)malloc(sizeof(int)*InitSize);
l.MaxSize=InitSize;
l.length=0;
}
//扩容
void increaseSize(SqList1& l,int length){
int* q=l.element;
l.element=(int*)malloc((l.MaxSize+length)*sizeof(int));
for(int i=0;i<l.length;i++){
l.element[i]=q[i];
}
l.MaxSize+=length;
free(q);
}
//打印
void printList(SqList1& l){
for(int i=0;i<l.length;i++)
cout<<l.element[i]<<' ';
cout<<endl<<"length:"<<l.length<<endl;
}
//在位置i处插入数据
bool insertList(SqList1& l,int i,int e){
if(i<1||i>l.length+1)return false;
if(l.length>=l.MaxSize)return false;
for(int j=l.length;j>=i;j--){
l.element[j]=l.element[j-1];
}
l.element[i-1]=e;
l.length++;
return true;
}
//删除位置i的元素,用e存储删除的值
bool deletList(SqList1& l,int i,int& e){
if(i<1||i>l.length)return false;
if(l.length<=0)return false;
e=l.element[i-1];
for(int j=i;j<l.length;j++){
l.element[j-1]=l.element[j];
}
l.length--;
cout<<"删除的值为:"<<e<<endl;
return true;
}
//按位置查找
int locateElement0(SqList1& l,int i){
return l.element[i-1];
}
//按值查找,返回下标
int locateElement1(SqList1& l,int e){
for(int i=0;i<l.length;i++){
if(l.element[i]==e)return i;
}
return -1;
}
int main()
{
SqList1 L;//定义
initList1(L);//初始化
increaseSize(L,3);//扩容
insertList(L,1,2);//插入
insertList(L,2,3);
insertList(L,3,0);
insertList(L,4,9);
printList(L);//打印
int e=-1;
deletList(L,2,e);//删除
printList(L);
cout<<"第2个位置为:"<<locateElement0(L,2)<<endl;//查找
cout<<"9这个值所在下标处:"<<locateElement1(L,9)<<endl;
return 0;
}
#include <iostream>
#include <cstdlib>
using namespace std;
//单链表
typedef struct LNode{
int data;
LNode* next;
}LNode,*LinkList;
//初始化(不带头结点的)
bool initList0(LinkList& L){
L=NULL;//空表
return true;
}
//初始化(带头结点的)
bool initList1(LinkList& L){
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)return false;//创建头节点失败
L->next=NULL;
return true;
}
//后插
bool insertNextNode(LNode* p,int i){
if(p==NULL)return false;
LNode* q=(LNode*)malloc(sizeof(LNode));
if(q==NULL)return false;//创建失败
q->data=i;
q->next=p->next;
p->next=q;
return true;
}
//前插
bool insertPriorNode(LNode* p,int i){
if(p==NULL)return false;
LNode* q=(LNode*)malloc(sizeof(LNode));
if(q==NULL)return false;//创建失败
q->next=p->next;
p->next=q;
q->data=p->data;
p->data=i;
return true;
}
//按位置插入(不带头结点)
bool ListInsert0(LinkList& L,int i,int e){
if(i<1)return false;
//对于第一个位置需要特殊处理
if(i==1){
LNode* s=(LNode*)malloc(sizeof(LNode));
s->next=L;
s->data=e;
L=s;//新表的首位
return true;
}
LNode* p=L;
int j=1;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}//循环到i-1位置处跳出循环
if(p==NULL)return false;//i的位置不合法
//后插法即可
return insertNextNode(p,e);
}
//按位置插入(带头结点)
bool ListInsert1(LinkList& L,int i,int e){
if(i<1)return false;
LNode* p=L;
int j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}//循环到i-1位置处跳出循环
if(p==NULL)return false;//i的位置不合法
//后插法即可
return insertNextNode(p,e);
}
//按位置删除
bool delteNodeByLocation(LinkList& L,int i,int& e){
if(i<1)return false;
LNode* p=L;
int j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL)return false;//i的位置不合法
if(p->next==NULL)return false;//i-1之后放好没有节点
LNode* q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
//指定节点删除
bool deleteNode(LNode* p){
if(p==NULL)return false;//如果指定节点是最后一个,则q节点为空不合法
LNode* q=p->next;
p->data=q->data;
p->next=q->next;//p被后面节点的值覆盖
free(q);//删除多余的节点
//偷梁换柱
return true;
}
//打印
void printList(LinkList& L){
if(L==NULL)return;
LNode* p=L->next;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//按位置查找,返回第i个元素
LNode* GetNodebyLocation(LinkList L,int i){
if(i<0)return NULL;
LNode* p=L;
int j=0;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找,返回值为e的节点
LNode* GetNodeByValue(LinkList L,int e){
LNode* p=L->next;
while(p!=NULL&&p->data!=e)
p=p->next;
return p;
}
//求表的长度
int length(LinkList L){
int len=0;
LNode* p=L;
while(p!=NULL){
p=p->next;
len++;
}
return len;
}
int main(){
LinkList L;//定义
initList1(L);//有头节点初始化
ListInsert1(L,1,1);//插入
ListInsert1(L,1,2);
ListInsert1(L,1,3);
ListInsert1(L,1,9);
printList(L);//打印
int e=0;
delteNodeByLocation(L,2,e);//按位置删除
cout<<"e的值为:"<<e<<endl;
printList(L);
deleteNode(L);//删除头节点
printList(L);
insertPriorNode(L,12);//前插
printList(L);
ListInsert0(L,2,2);//没有头节点的插入
printList(L);
}
#include <iostream>
#include <cstdlib>
using namespace std;
//单链表
typedef struct LNode{
int data;
LNode* next;
}LNode,*LinkList;
//初始化单链表(带头结点的)
bool InitList(LinkList& L){
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)return false;
L->next=NULL;
return true;
}
//尾插法建立单链表
bool List_TailInsert(LinkList& L){
int x;
L=(LNode*)malloc(sizeof(LNode));
LNode *s,*r=L;
cin>>x;
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
cin>>x;
}
r->next=NULL;
return L;
}
//头插法建立单链表
LinkList List_HeadInsert(LinkList& L){
LNode* s;
int x;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;//初始化为空,很关键
cin>>x;
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->next=L->next;
L->next=s;
s->data=x;
cin>>x;
}
return L;
}
//打印
void printList(LinkList& L){
if(L==NULL)return;
LNode* p=L->next;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main(){
LinkList L;//定义
//List_TailInsert(L);
List_HeadInsert(L);
printList(L);
}
#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*DLinklist;
//初始化
bool InitDLinklist(DLinklist& L){
L=(DNode*)malloc(sizeof(DNode));
if(L==NULL)return false;
L->prior=NULL;
L->next=NULL;
return true;
}
//在p节点后插入s节点
bool InsertNextDNode(DNode* p,DNode* s){
if(p==NULL||s==NULL)return false;
s->next=p->next;
if(p->next!=NULL)p->next->prior=s;
p->next=s;
s->prior=p;
return true;
}
//删除p结点的后继结点
bool DeleteNextDNode(DNode* p){
if(p==NULL)return false;
DNode* q=p->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
//双链表的删除
void DestroyList(DLinklist& L){
while(L->next!=NULL)
DeleteNextDNode(L);
free(L);
L=NULL;
}
int main(){
DLinklist L;
InitDLinklist(L);
DestroyList(L);
}
#include <iostream>
#include <cstdlib>
using namespace std;
//循环单链表
typedef struct LNode{
int data;
LNode* next;
}LNode,*LinkList;
//初始化循环单链表
bool InitList(Linklist& L){
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)return false;
L->next=L;
return true;
}
//判断循环链表是否为空
bool Empty(LinkList& L){
return (L->next==L);
}
//判断p结点是否为循环单链表的尾结点
bool isTail(LinkList& L,LNode* p){
return (p->next==L);
}
typedef struct DNode{
int data;
DNode *prior,*next;
}DNode,*DLinklist;
//初始化双向循环链表
bool InitDLinklist(DLinklist& L){
L=(DNode*)malloc(sizeof(DNode));
if(L==NULL)return false;
L->prior=L;
L->next=L;
return true;
}
//双向循环链表的插入
bool InsertNextNode(DNode* p,DNode* s){
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
}
//删除p的后继结点q
bool DeleteNextDNode(DNode* p){
DNode* q=p->next;
p->next=q->next;
p->next->prior=p;
free(q);
return true;
}
#include <iostream>
#include <cstdlib>
using namespace std;
#define Maxsize 100
typedef struct LNode {
int data;
int next;
} LinkList[Maxsize];
// 初始化链表
void InitList(LinkList &L) {
L[0].next = -1; // 头节点的next设置为-1,表示链表为空
for (int i = 1; i < Maxsize; i++) {
L[i].next = -2; // 使用-2表示该位置是空闲的
}
}
// 在链表的第i个位置插入元素e
bool ListInsert(LinkList &L, int i, int e) {
if (i < 1 || i >= Maxsize) return false; // 检查插入位置的合法性
int j = 0;
// 查找第i-1个位置
for (int k = 1; k < i; k++) {
j = L[j].next;
if (j == -1) return false; // 如果已经到达链表末尾
}
// 查找空闲位置
int free = 1;
while (L[free].next != -2 && free < Maxsize) free++;
if (free == Maxsize) return false; // 没有空闲位置
L[free].data = e;
L[free].next = L[j].next;
L[j].next = free;
return true;
}
// 删除链表的第i个元素
bool ListDelete(LinkList &L, int i) {
if (i < 1 || i >= Maxsize) return false;
int j = 0;
// 查找第i-1个位置
for (int k = 1; k < i; k++) {
j = L[j].next;
if (L[j].next == -1) return false; // 如果已经到达链表末尾
}
int toDelete = L[j].next;
if (toDelete == -1) return false; // 没有元素可以删除
L[j].next = L[toDelete].next;
L[toDelete].next = -2; // 将删除的位置标记为空闲
return true;
}
// 打印链表所有元素
void PrintList(LinkList &L) {
int j = L[0].next; // 从头节点开始
while (j != -1) {
cout << L[j].data << " ";
j = L[j].next;
}
cout << endl;
}
int main() {
LinkList L;
InitList(L);
ListInsert(L, 1, 10);
ListInsert(L, 2, 20);
ListInsert(L, 3, 5);
ListInsert(L, 2, 90);
ListInsert(L, 2, 17);
cout << "After insertions: ";
PrintList(L); // 打印插入后的链表
ListDelete(L, 1); // 删除链表第1个位置的元素
cout << "After deletion: ";
PrintList(L); // 打印删除后的链表
return 0;
}