c语言实现单链表的基本操作
#include<stdio.h>
#include<stdlib.h>
typedef struct lnode{
int data;
struct lnode *next;
}lnode ,*linklist;
//初始化
bool InitList (linklist &L){
L=(lnode*)malloc(sizeof(lnode));
if(L==NULL) //内存不够
return false;
L->next=NULL; //头节点的next指向空
return true;
}
//插入
bool ListInsert(linklist &L,int i,int e){
if(i<1)
return false;
lnode *p;
int j=0;
p=L;
while(p!=NULL &&j<i-1){
p=p->next;
j++;
}
if(p==NULL)
return false;
lnode *s = (lnode*)malloc(sizeof(lnode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
//遍历
void PrintList(lnode *L){
printf("链表内容为:");
while(L->next!=NULL){
printf("%5d",L->next->data);
L=L->next;
}
printf("\n");
}
//尾插法
linklist List_TailInsert(linklist &L)
{
int x;
L=(linklist)malloc(sizeof(lnode));
lnode *s,*r=L;
printf("输入") ;
scanf("%d",&x);
while(x!=666)
{
s=(lnode *)malloc(sizeof(lnode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//头插
//按位查找
lnode * GetElem(linklist &L,int i){
if(i<0)
return NULL;
lnode *p;
int j=0;
p=L;
while(p!= NULL && j<i){
p=p->next;
j++;
}
return p;
}
//按值查找
lnode *LocateElem(linklist &L,int e){
lnode *p=L->next;
while(p!=NULL&&p->data!=e)
p=p->next;
return p;
}
// 删除
bool ListDelete(linklist &L,int i, int &e){
printf("-----");
if(i<1)
return false;
lnode *p;
int j=0;
p=L;
while (p->next!=NULL&&j<i-1){
p=p->next;
j++;
}
printf("-----");
if(p->next==NULL)
return false;
linklist q=p->next;
e =q->data;
p->next=q->next;
free(q);
return true;
}
//主函数
int main(){
//初始化
linklist L;
if(InitList(L))
printf("初始化完成\n");
//尾插法建表
List_TailInsert( L);
PrintList(L);
//插入一个数据
int i;
int t;
printf("输入要插入的位置和数据");
scanf("%d%d",&i,&t);
printf("e的值为%d\n",t);
ListInsert(L ,i,t);
PrintList(L);
//按位查找
int x;
printf("输入要查找的数值的位序\n");
scanf("%d",&x) ;
printf("%d\n",GetElem(L,x));
//按值查找
int m;
printf("输入要查找的数值\n");
scanf("%d",&m) ;
printf("%d\n",LocateElem(L,m) );
//删除操作
int g,h;
printf("输入要删除元素的位序\n");
scanf("%d",&h);
ListDelete(L,h,g);
printf("删除的元素是:%d\n",g);
PrintList(L);
return 0;
}