#include<stdio.h>
#include<malloc.h>
typedef char elemtype;
typedef struct lnode{
elemtype data;
struct lnode*next;
}linknode;
//创建单链表
//头插法
void createlist(linknode*&L,elemtype a[],int n){
//创建头结点
L=(linknode*)malloc(sizeof(linknode));
L->next=NULL;
//创建一般结点
linknode*p;
for(int i=0;i<n;i++){
p=(linknode*)malloc(sizeof(linknode));
p->data=a[i];
p->next=L->next;
L->next=p;
}
}
//尾插法
void createlist_1(linknode*&L,elemtype a[],int n){
//创建头节结点
L=(linknode*)malloc(sizeof(linknode));
L->next=NULL;
linknode*r=L;
//创建一般结点
linknode*p;
for(int i=0;i<n;i++){
p=(linknode*)malloc(sizeof(linknode));
p->data=a[i];
r->next=p;
r=p;
}
r->next=NULL;
}
//初始化单链表
void initlist(linknode*&L){
L=(linknode*)malloc(sizeof(linknode));
L->next=NULL;
}
//销毁单链表
void destroyllist(linknode*&L){
linknode*pre=L,*p=L->next;
while(p!=NULL){
free(pre); //从头结点开始释放
pre=p;
p=pre->next;
}
free(pre);
}
//判空
bool listempty(linknode*L){
return (L->next==NULL);
}
//求长度
int listlength(linknode*L){
int i=0;
linknode*p=L;
while(p->next!=NULL){
i++;
p=p->next;
}
return (i);
}
//输出
void displist(linknode*L){
linknode*p=L->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
//按位求值
bool getelem(linknode*L,int i,elemtype &e){
int j=1;
linknode*p=L->next;
if(i<=0)
return false;
while(j<i&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL)
return false;
else{
e=p->data;
return true;
}
}
//按值求位
int locateelem(linknode*L,elemtype e){
int i=1;
linknode*p=L->next;
while(p!=NULL&&p->data!=e){
i++;
p=p->next;
}
if(p==NULL)
return(0);
else
return(i);
}
//单链表在插入和删除时,让p指向头结点
//插入
bool listinsert(linknode*&L,int i,elemtype e){
int j=1;
linknode*p=L,*s;
if(i<=0)
return false;
while(p->next!=NULL){
if(j==i){
s=(linknode*)malloc(sizeof(linknode));
s->next=p->next;
p->next=s;
return true;
}
j++;
p=p->next;
}
}
//删除第i个元素
bool listdelete(linknode*&L,int i){
linknode*p=L,*s;
int j=1;
while(p->next!=NULL&&j<i){
j++;
p=p->next;
}
//注意此时p指向第i-1个结点
if(j==i){
s=p->next;
p->next=p->next->next;
free(s);
return true;
}
else
return false;
}
//删除等于e的元素
void elemdelete(linknode*&L,elemtype e){
linknode*p=L;
while(p->next!=NULL){
if(p->next->data==e){
linknode*s;
s=p->next;
p->next=p->next->next;
free(s);
}
p=p->next;
}
}
int main(){
linknode*L;
elemtype a[]="ichina\0",e;
createlist_1(L,a,6);
printf("长度是%d\n",listlength(L));
printf("L为:%s\n",(listempty(L)?"空":"非空"));
displist(L);
getelem(L,1,e);
printf("第1位元素是%c\n",e);
printf("'h'的位置是%d\n",locateelem(L,'h'));
//listinsert(L,3,'a'); // 可能会出现中文
displist(L);
listdelete(L,1);
displist(L);
elemdelete(L,'i');
displist(L);
destroyllist(L);
}