二、演示单链表的创建、插入、删除和查找等操作:
#include<stdio.h>
#include<malloc.h>
#include<process.h>
typedef int elemtype;
typedef struct lnode
{
elemtype data;
struct lnode *next;
}lnode,*linklist;
//链表的创建
void initlist(linklist&L)
{
L=(linklist)malloc(sizeof(lnode));
L->next=NULL; //构造了头结点
}
//链表的插入
void insertlist(linklist &L,int i,elemtype e)
{
linklist p=L,s;
int j=0;
while(j<i-1)
{
p=p->next;
j++;
}
s=(linklist)malloc(sizeof(lnode));
s->data=e;
s->next=p->next;
p->next=s;
}
//链表的删除
void deletlist(linklist L,int i)
{
linklist p=L,q;
int j=0;
while(j<i-1&&p!=NULL)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);
}
//查找元素e是链表的第几个元素
int locatelist(linklist &L,elemtype e)
{
linklist p=L->next;
int n=1;
while(p->data!=e&&p!=NULL)
{
p=p->next;
n++;
}
return n;
}
//查找链表的第i个元素是什么
elemtype getelem(linklist &L,int i)
{
linklist p=L;
int j=0;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
return p->data;
}
//输出链表的元素
void displist(linklist &L)
{
linklist p=L->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
}
//求链表的长度(即元素个数)
int listlength(linklist &L)
{
linklist p=L;
int n=0;
while(p->next!=NULL)
{
p=p->next;
n++;
}
return n;
}
//判断链表是否为空表
int listempty(linklist &L)
{
return (L->next==NULL);
}
//销毁链表
void destroylist(linklist &L)
{
linklist p=L,q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
}
int main()
{
linklist h;
printf("1.初始化链表h\n");
initlist(h);
printf("此时链表为%s\n",(listempty(h)?"空表":"非空"));
printf("2.输出链表h长度为%d\n",listlength(h));
printf("3.依次插入元素1、2、3、4、5、6、7、8、9\n");
for(int i=1;i<10;i++)
{
insertlist(h,i,i);
}
printf("4.输出链表h长度为%d\n",listlength(h));
printf(".输出链表为:");
displist(h);
printf("\n");
printf("5.在第五个位置插入11\n");
insertlist(h,5,11);
printf("此时链表h长度为:%d\n",listlength(h));
printf("输出链表为:");
displist(h);
printf("\n");
printf("6.删除第7个\n");
deletlist(h,7);
printf("此时链表h长度为%:%d\n",listlength(h));
printf("输出链表为:");
displist(h);
printf("\n7.输出第5个元素为:%d\n",getelem(h,5));
printf("8.元素9是第%d个元素\n",locatelist(h,9));
printf("9.销毁链表!\n");
destroylist(h);
printf("Bye-bye!");
system ("pause");
}
运行结果: