c实现数据结构中单向链表创建,插入,删除,查找,销毁


#include 
#include 
#define MaxSize 100
#define ElementType int
typedef struct node{
    ElementType data;
    struct node *link;
}LNode,*LinkList;
//求链表长度
int LENGTH(LinkList list);
//创建链表
LinkList CREATE(int n);
//输出链表
void print(LinkList list);
//插入item元素
void INSERTLINK1(ElementType item,LinkList list);
//指定位置插入元素item
void INSERTLINK3(LinkList list,int i,ElementType item);
//销毁线性链表
LinkList DESTORYLINKLIST(LinkList list);
//销毁线性链表中相同元素
LinkList DELETESAMEELEMENT(LinkList list);
//移动最小值结点到链表表头
LinkList removemin(LinkList list);
//移动最大值结点到链表表头
LinkList removemax(LinkList list);
int main(){
    LinkList list;
    ElementType item;
    printf("create linklist\n");
    list = CREATE(10);
    int length = LENGTH(list);
    printf("链表长度为%d\n",length);
    print(list);
//    printf("请输入想插入到链表头的数据");
//    scanf("%d",&item);
//    print(INSERTLINK1(item,list));
//    printf("在第2个结点后插入数据\n");
//    print(INSERTLINK3(list,2,item));
//    printf("destory list\n");
//    print(DESTORYLINKLIST(list));
//    printf("销毁线性链表中相同的元素\n");
//    print(DELETESAMEELEMENT(list));
//    printf("将值最小元素移到链表最前面\n");
//    print(removemin(list));
    printf("移动最大元素到链表结尾");
    print(removemax(list));
    
}
//创建线性链表
LinkList CREATE(int n){
    LinkList p,r,list=NULL;
    ElementType a;
    for(int i=1;i<=n;i++){
        printf("请输入第%d个数据",i);
        scanf("%d",&a);
        p = (LinkList) malloc(sizeof(LinkList));//申请一个新的链结点
        p->data = a;
        p->link=NULL;
        if (list == NULL) {
            list = p;
        }else{
            r->link = p;//将新结点链接在链表尾部
        }
        r=p;
    }
    
    
    return list;
}
//求线性链表长度,非递归算法
int LENGTH(LinkList list){
    LinkList p = list;
    int n=0;//链表长度置初值为0
    while(p!=NULL){
        p=p->link;
        n++;
    }
    return n;//返回链表长度
}
//打印链表中的数据
void print(LinkList list){
    LinkList p;
    p=list;
    printf("输出链表中的数据\n");
    while(p!=NULL){
        printf("%d\t",p->data);
        p=p->link;
    }
    printf("\n");
}
//第一个结点前插入数据项item的新结点
void INSERTLINK1(ElementType item,LinkList list){
    LinkList p;//list指向链表第一个链结点
    p=(LinkList)malloc(sizeof(LinkList));//s申请一个新结点
    p->data = item;//将item送新结点数据域
    p->link = list;//将list送新结点指针域
    list = p;//修改指针list指向
}
//在链结点q后面插入数据信息为item的链结点
void INSERTLINK2(LinkList list,LinkList q,ElementType item){
    LinkList p;
    p=(LinkList)malloc(sizeof(LinkList));//构造一个新结点
    p->data = item;//将item送新结点数据域
    if(list == NULL){//若原链表为空
        list = p;
        p->link = NULL;
    }else{//原链表不为空
        p->link = q->link;
        q->link = p;
    }
    
}
//在第i个结点后面插入一个数据信息为item的新结点
void INSERTLINK3(LinkList list,int i,ElementType item){
    LinkList p,q=list;
    for(int j=0;j<=i-1;j++){//存在第i个结点
        q=q->link;
        if(q == NULL){//不存在第i个结点
            break;
        }
    }
    p=(LinkList)malloc(sizeof(LinkList));//构造一个新结点
    p->data = item;//将item送入新结点数据域
    p->link = q->link;
    q->link = p;//将新结点插入到第i个结点之后
}
//从非空线性链表中删除q指的链结点,设q的直接前驱结点由r指出
void DELETELINK1(LinkList list,LinkList r,LinkList q){
    if(q == list){
        list = q->link;//删除链表的第一个链结点
    }else{
        r->link = q->link;//删除q指的链结点
       
    }
    free(q);//释放被删除的结点空间
}
//从非空链表中删除q指的链结点
void DELETELINK2(LinkList list,LinkList q){
    LinkList r;
    if(q == list){//当删除链表第一个结点
        list = list->link;
        free(q);//释放被删除结点的空间
    }else{
        //寻找q结点的直接前驱r
        r = list;
        while(r->link !=q && r->link!=NULL){//移向下一个链结点
            r = r->link;
        }
        if(r->link != NULL){
            r->link = q->link;
            free(q);
        }
    }
}
//查找list所指线性链表倒数第k个结点
LinkList SEARCHNODE(LinkList list ,int k){
    LinkList p,q;
    int i;
    if(list!=NULL && k>0){
        for(i=1;ilink;
            if(p==NULL){
                printf("链表不存在倒数第k个结点");
            }
        }
    }
    q=list;
    while(p->link!=NULL){
        p=p->link;
        q=q->link;
    }//p指向链表最后那个结点,q指向倒数第k个结点
    return q;//给出链表倒数第k个结点(q指向的那个结点)的地址
}
//销毁线性链表
LinkList DESTORYLINKLIST(LinkList list){
    //list存放链表的首地址
    LinkList p=list;
    while(list!= NULL){
        list=list->link;//保存下一个链结点的位置
        free(p);//删除并释放p指的当前结点
        p=list;//下一链结点称为当前结点
    }
    return list;
}
//销毁线性链表中相同元素
LinkList DELETESAMEELEMENT(LinkList list){
    LinkList p,r,q;
    p=list;
    while(p!=NULL){
        r=p;
        q=p->link;
        while(q!=NULL){
            if(p->data == q->data){
                r->link = q->link;
                free(q);
                q=r->link;
            }else{
                r=q;
                q=r->link;
            }
        }
        p=p->link;
    }
    return list;
}
//移动最小值结点到链表表头
LinkList removemin(LinkList list){
    LinkList p,q,s,r;
    q=list;
    p=list->link;
    r=list;
    //找到值最小的那个结点
    while(p!=NULL){
        if(q->data > p->data){
            s=r;
            q=p;
        }
        r=p;
        p=p->link;
    }
    //若值最小结点不是链表最前面的那个点
    if(q!=list){
        s->link = q->link;
        q->link=list;
        list = q;
    }
    return list;
}
//移动最大值结点到链表表头
LinkList removemax(LinkList list){
    LinkList p,q,s,r;
    q=list;
    p=list->link;
    r=list;
    //寻找值最大的那个结点
    while(p!=NULL){
        if(q->data < p->data){
            s=r;
            q=p;
        }
        r=p;
        p=p->link;
    }
    //若值最大结点不是链表结尾的那个点
    if(q!=r){
        if(q!=list){
            //如果最大值不是链表头结点
            s->link = q->link;
        }else{
            //如果最大值是链表头结点
            list = q->link;
        }
        r->link=q;
        q->link=NULL;
    }
    return list;
}

 

你可能感兴趣的:(数据结构C语言)