编辑代码

#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;
        }
    }
}