c语言之单链表

#define OVERFLOW -1;
#define OK 1;
#define ERROR 0;
#define FLASE 0;
#define TRUE 1;
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int Status;
typedef int ElemType;

typedef struct LNode{
                ElemType data;
                struct LNode *next;

}LNode,*LinkList;
Status CreatLinkL1(LinkList &L,int n,ElemType *E){
    int i;
    LinkList p;
    L=(LinkList)malloc(sizeof(LNode));
    if(!L) return ERROR;
    L->next=NULL;
    for(i=n-1;i>=0;--i)
    {
        if(!(p=(LinkList)malloc(sizeof(LNode))))
            return ERROR;
        p->data=    E[i];
        p->next=L->next;
        L->next=p;
    }
    return OK;
}
Status CreatLinkL2(LinkList &L,int n,ElemType *E)
{
    int i;
    LinkList p,r;
    L=(LinkList)malloc(sizeof(LNode));
    if(!L) return ERROR; 
    r=L;
    for(i=0;i<n;i++)
    {
        if(!(p=(LinkList)malloc(sizeof(LNode))))
            return ERROR;
        p->data=E[i];
        r->next=p;
        r=p;
    }
r->next=    NULL;
return OK;
}
Status InsertLinkL(LinkList &L,int i,ElemType e){
    LinkList s,p=L;
    int k=0;
    while(p->next!=NULL&&k<i-1){
    p=p->next;
    ++k;
    }
    if(!p->next||k>i-1) return ERROR;
    if(!(s=(LinkList)malloc(sizeof(LNode))))
        return  OVERFLOW;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
Status Del_LinkL1(LinkList L,int i,ElemType &e){
    int k=0;
    LinkList q,p=L;
    while(p->next!=NULL&&k<i-1){
    p=p->next;
    ++k;
    }
    if(!p->next||k>i-1)return ERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;free(q);
    return OK;

}
Status Del_LinkL2(LinkList &L,ElemType e){
LinkList p,q;
p=L;
q=L->next;

while(q->data!=e){
p=q;
q=q->next;
}
//if(q=NULL)
//  return ERROR;
    p->next=q->next;
    free(q);
    return OK;
}
Status Del_LinkL3(LinkList &L,ElemType e){

LinkList p,q;
int tag=FLASE;
p=L;
q=L->next;
while(q!=NULL){
    if(q->data==e){
    p->next=q->next;
    free(q);tag=TRUE;
    }
    else
        p=q;
        q=p->next;

    } 
    return tag;
    }
    void PrintLinkL(LinkList L){
        LinkList p=L->next;
        while(p){
            printf("%d->",p->data);
            p=p->next;
        }
        printf("^\n");
        }
        void FreeLinkL(LinkList &L){
        LinkList p,q;
        p=L;
        while(p!=NULL){
            q=p;
            p=p->next;
            free(q);
                    }
            L=NULL;
    }
void main(){
        ElemType E[]={34,12,45,64,28,36,45,56};
        int i,n=8;
        LinkList head;
        ElemType rc;
        printf("(1)表头插入法创建单链表....\n");
        if(!CreatLinkL1(head ,n,E)  ){
            printf("内存不够,创建失败");
        return   ;

        }
        else
        {

        printf("创建完成。链表输出...."); 
        PrintLinkL(head);

    }
    printf("(2)表尾插入法创建链表...\n");
    FreeLinkL(head);
    if(! CreatLinkL2(head,n,E)){
            printf("内存不够,创建失败\n");
            return ;    }
    else
    {
            printf("创建完成。链表输出...."); 
        PrintLinkL(head);

    }
         printf("(3)指定位置插入...\n");
         printf("输入插入位置和指定元素==>");
         scanf("%d%d",&i,&rc);
         if(!InsertLinkL(head,i,rc))
            printf("参数错误或内存不够,插入失败\n");
            else
            { printf("插入成功,链表输出;");
            PrintLinkL(head) ;

                }
                printf("(4)删除指定位置节点....\n");
                printf("输入被删除位置的==>");
                scanf("%d",&i) ;
                if(!Del_LinkL1(head,i,rc))
                printf("参数错误,删除失败\n");
                else
                {
                    printf("删除成功!被删除的节点键值是:%d\n 链表输出:",rc);
                        PrintLinkL(head) ;//    
                   }   
    printf("(5)删除指定值节点....\n");
        printf("输入被删除的键值==>");
     scanf("%d",&rc);
    if(!Del_LinkL2(head,rc))
        printf("输入的键值不存在!\n");
     else
        {
            printf("删除成功!链表输出:");
                PrintLinkL(head) ;

     }
         printf("(6)删除指定值所有节点...\n");
            printf("输入被删除的键值==>");

            scanf("%d",&rc);
        if(!Del_LinkL3(head,rc))

        printf("输入的键值不存在!\n");
        else
        {
            printf("删除成功!链表输出;");
                PrintLinkL(head) ;

         }
         printf("(7)清空链表....\n") ;
         FreeLinkL(head);
         if(!head)
         printf("链表已清空\n") ;
         else
            printf("链表清空失败");
             } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值