#include<stdio.h>
#include<malloc.h>
typedef struct list
{
int data;
struct list *next;
}LIST;
void initlist(LIST **p)
{
*p=NULL;
}
void insertlist1(LIST **p,int item,int rc)
{
int i;
LIST *u,*q,*r;
u=(LIST*)malloc(sizeof(LIST));
u->data=item;
for(i=1,r=*p;i<rc&&r!=NULL;i++)
{
q=r;
r=r->next;
}
if(r==*p)
*p=u;
else
q->next=u;
u->next=r;
}
void insertlist2(LIST **p,int item)
{
LIST *u,*q,*r;
u=(LIST*)malloc(sizeof(LIST));
u->data=item;
for(r=*p;r!=NULL&&r->data<item; q=r,r=r->next)
if(r==*p)
*p=u;
else
q->next=u;
u->next=r;
}
int deletelist(LIST **p,int item)
{
LIST *q,*r;
q=*p;r=q;
if(q==NULL)
return 1;
if(q->data==item)
{
*p=q->next;
free(r);
return 0;
}
for( ;q->data!=item&&q->next!=NULL;r=q,q=q->next)
if(q->data==item)
{
r->next=q->next;
free(q);
return 0;
}
return 1;
}
int findlist(LIST *p,int item)
{
int i;
for(i=1;p->data!=item&&p!=NULL;p=p->next,i++)
return(p==NULL)?-1:i;
}
void outputlist(LIST *p)
{
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
void freelist(LIST **p)
{
LIST *q,*r;
for(q=*p;q!=NULL;)
{
r=q;
q=q->next;
free(r);
}
*p=NULL;
}
int main()
{
LIST *p;
int op,i,rc;
initlist(&p);
while(1)
{
printf("---------------\n");
printf("- 1:指定位置追加\n");
printf("- 2:升序追加\n");
printf("- 3:查找结点\n");
printf("- 4:删除结点\n");
printf("- 5:输出链表\n");
printf("- 6:清空链表\n");
printf("- 0:退出\n");
printf("--------------\n");
printf("请输入0~6 进行操作:");
fflush(stdin);
scanf("%d",&op);
switch(op)
{
case 0:
return -1;
case 1:
printf("请输入新增结点的键值和位置:");
scanf("%d%d",&i,&rc);
insertlist1(&p,i,rc);
break;
case 2:
printf("请输入新增结点的键值:");
scanf("%d",&i);
insertlist2(&p,i);
break;
case 3:
printf("请输入要查找结点的键值:");
scanf("%d",&i);
rc=findlist(p,i);
if(rc>0)
printf(" 位置位 %d\n",rc);
else
printf("没有找到\n");
break;
case 4:
printf("请输入要删除的结点的键值:");
scanf("%d",&i);
rc=deletelist(&p,i);
if(rc==0)
printf("删除成功!\n",rc);
else
printf("没找到!\n");
break;
case 5:
printf("\n 链表内容为:\n");
outputlist(p);
break;
case 6:
freelist(&p);
break;
}
}
}