#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}*LinkList,LNode;
//初始化链表
bool InitList(LinkList &L){
L=NULL;
return true;
}
//判断链表是否为空
bool isEmpty(LinkList L){
return (L==NULL);
}
//头插法(按位插入)
bool ListInsert(LinkList &L,int i,int x){
if(i<1){
return false;
}
if(i==1){
LNode *s=(LNode *)malloc(sizeof(LNode)); //动态创建一个node节点空间
if(s==NULL){
return false;
}
s->data=x; //将e赋值给s的data节点
s->next=L; //将L的地址赋值给s->next节点
L=s; //将s地址赋值给L;
return true;
}
LNode *p; //定义一个指向当前扫描到的节点
int j=1; //当前p指向的是第几个节点
p = L; //p指向第一个节点(主义:不是头节点)
while(p!=NULL && j<i-1){ // 循环到指定位置或者到尾节点时跳出循环,
p=p->next; //将p->next赋值给p
j++; //加一操作
}
if(p==NULL){ //p==NULL,说明插入的位置的 i 的值过大了,超出了边表长度
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode)); //动态创建一个node节点空间
if(s==NULL){ //内存分配失败
return false;
}
s->data =x; //将e赋值给s的data节点
s->next = p->next; //将p->next的地址赋值给s->next节点
p->next = s; //将s地址赋值给p->next
return true; //插入成功
}
//指定节点前插操作(含头指针)
bool InsertPriorNode_HaveHeadNode(LinkList L,LNode *p,int x){
if(p==NULL){
return false;
}
LNode *s =(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
LNode *k =(LNode *)malloc(sizeof(LNode));
k=L;
while(k->next==p){
k=k->next;
}
s->data=x;
s->next=p;
k->next=s;
return true;
}
//指定节点前插操作(不含头指针)
bool InsertPriorNode_NoneHeadNode(LNode *p,int x){
if(p==NULL){
return false;
}
LNode *s =(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=x;
return true;
}
//指定元素的后插操作(节点p,要插入的元素x)
bool InsertNextNode(LNode *p,int x){
if(p==NULL){ //p==NULL,说明插入的位p为空
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode)); //动态创建一个node节点空间
if(s==NULL){ //内存分配失败
return false;
}
s->data =x; //将e赋值给s的data节点
s->next = p->next; //将p->next的地址赋值给s->next节点
p->next = s; //将s地址赋值给p->next
return true; //插入成功
}
//删除元素(第几位,将删除的元素返回)
bool ListDelete(LinkList &L,int i,int &e){
int w=i-1;
if(w<1){
return false;
}
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<w-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
if(p->next==NULL){
return false;
}
LNode *q = p->next;
e= q->data;
p->next=q->next;
free(q);
return true;
}
//查找元素(按位查找)
LNode *GetElemByIndex(LinkList L,int i){
if(i<1){
return NULL;
}
LNode *p;
int j=1;
p=L;
while(p!=NULL && j<i){
p=p->next;
j++;
}
return p;
}
//查找元素(按值查找)
void GetElemByValue(LinkList L,int x){
if(isEmpty(L)){
return ;
}
LNode *p;
p=L;
int i=1;
for(p=L;p!=NULL;p=p->next){
if(p->data==x){
printf("第%d上的元素为%d\n",i,p->data);
}
i++;
}
}
//链表长度
int Length(LinkList L){
if(isEmpty(L)){
return 0;
}
int len = 1;
LNode *p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
//打印链表
void Display(LinkList L){
int i=1;
if(isEmpty(L)){
return ;
}
LinkList p=L;//将temp指针重新指向头结点
//只要temp指针指向的结点的next不是Null,就执行输出语句。
while (p) {
printf("第%d元素为%d \n",i,p->data);
p=p->next;
i++;
}
printf("\n");
}
int main(){
LinkList L;
InitList(L);
for(int i=1;i<=10;i++){
ListInsert(L,i,i);
}
Display(L);
//按位查找元素,返回当前节点
LNode *p=GetElemByIndex(L,3);
printf("第3位上的元素为%d\n",p->data);
// 前插不含头指针
InsertPriorNode_NoneHeadNode(p,13);
Display(L);
// 前插含头指针
InsertPriorNode_HaveHeadNode(L,p,14);
Display(L);
//后插
InsertNextNode(p,12);
Display(L);
//链表长度
int length_front = Length(L);
printf("当前链表的长度为%d\n",length_front);
printf("\n\n");
//删除元素
int e=-1;
ListDelete(L,3,e);
Display(L);
printf("被删除的元素为%d\n",e);
printf("\n\n");
//查找(无返回值)
GetElemByValue(L,3);
printf("\n\n");
//链表长度
int length_back = Length(L);
printf("当前链表的长度为%d\n",length_back);
return 0;
}
单链表增删改查(无头指针)
最新推荐文章于 2023-09-05 14:34:39 发布