#include <stdio.h>
#include <stdlib.h>
//(无头结点版
typedef struct LNode{
int data;
LNode *next;
}LNode,*Linklist;
//头插法建立单链表
Linklist CreatList(Linklist &L,int n,int a[]){
LNode *p;
L=(Linklist)malloc(sizeof(LNode));
L->next=NULL;
L->data=a[0];
// printf("%d",L->data);
for(int i=1;i<n;i++){
// printf("%d ",L->data);
p=(LNode *)malloc(sizeof(LNode));
p->data=a[i];
p->next=L;
L=p;
}
return L;
}
//尾插法建立单链表
Linklist CreatList2(Linklist &L,int n,int a[]){
LNode *p,*r;
L=(Linklist)malloc(sizeof(LNode));
L->next=NULL;
L->data=a[0];
r=L;
// printf("%d",L->data);
for(int i=1;i<n;i++){
// printf("%d ",L->data);
p=(LNode *)malloc(sizeof(LNode));
p->data=a[i];
r->next=p;
p->next=NULL;
r=p;
}
return L;
}
// 初始化单链表
//求单链表的长度
int LengthList(Linklist L){
int i=0;
LNode *p;
p=L;
while(p->next!=NULL){
i++;
p=p->next;
}
i=i+1;
printf("%d",i);
return i;
}
//输出单链表
Linklist PrintfList(Linklist L,int n){
if(L==NULL){
printf("列表为空");
return L;
}
LNode *p;
p=L;
while(p->next!=NULL){
printf("%d",p->data);
p=p->next;
}
printf("%d",L->data);
}
//按位置查找单链表
int LocateList(Linklist L,int x){
LNode *p;
p=L;
for(int i=1;i<x;i++){
p=p->next;
}
printf("第%d位的元素是%d",x,p->data);
return p->data;
}
//按值查找单链表
int LocateList2(Linklist L,int x){
LNode *p;
p=L;
int i=0;
while(x!=p->data){
i++;
p=p->next;
}
printf("%d元素的位置是%d",p->data,i+1);
return i+1;
}
//按位增加单链表(前插法,第i个元素之前插入)
int InsertList(Linklist &L,int x,int e){
LNode *p;
p=L;
for(int i=1;i<x-1;i++){
p=p->next;
}
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
// printf("第%d位的元素是%d",x,p->data);
return p->data;
}
//按位增加单链表(后插法,第i个元素之后插入)
int InsertList2(Linklist &L,int x,int e){
LNode *p;
p=L;
for(int i=1;i<x;i++){
p=p->next;
}
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
// printf("第%d位的元素是%d",x,p->data);
return p->data;
}
//在x值前增加e
Linklist InsertList3(Linklist &L,int x,int e){
LNode *p;
p=L;
int i=0;
while(x!=p->data){
p=p->next;
}
// p=p->next;
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=p->data;
p->data=e;
s->next=p->next;
p->next=s;
// printf("第%d位的元素是%d",x,p->data);
return L;
}
//按位置删除单链表
Linklist DelateList2(Linklist &L,int x){
LNode *p;
p=L;
for(int i=1;i<x-1;i++){
p=p->next;
}
LNode *s=p->next;
p->next=s->next;
free(s);
// printf("第%d位的元素是%d",x,p->data);
return L;
}
//按值删除x的单链表
Linklist DelateList(Linklist &L,int x){
LNode *p;
p=L;
int j=0;
while(x!=p->data){
j++;
p=p->next;
}
p=L;
for(int i=1;i<j;i++){
p=p->next;
}
printf("%d\n",p->data);
LNode *s=p->next;
p->next=s->next;
free(s);
return L;
}
//按位修改单链表
Linklist RecrateList(Linklist &L,int x,int e){
LNode *p;
p=L;
for(int i=1;i<x;i++){
p=p->next;
}
p->data=e;
return L;
}
//按值修改单链表
Linklist RecratetList2(Linklist &L,int x,int e){
LNode *p;
p=L;
int i=0;
while(x!=p->data){
p=p->next;
}
p->data=e;
return L;
}
//销毁单链表
void DestroyList(Linklist &L)
{
LNode *pre=L,*p=pre->next;
while (p!=NULL)
{ free(pre);
pre=p;
p=pre->next;
}
free(pre);
L=NULL;
}
int main(){
int a[5]={1,2,4,3,5};
int n=5;
int x=5;
int e=7;
Linklist(L);
CreatList2(L,n,a);
// RecrateList(L,x,e);
// RecratetList2(L,x,e);
// InsertList3(L,x,10);
// DelateList(L,4);
// LengthList(L);
DestroyList(L);
PrintfList(L,n+1);
// LocateList2(L,x);
}
数据结构单链表无结点增删改查
最新推荐文章于 2024-06-12 16:00:39 发布