链表的增删改查

#include <stdio.h>
#include <stdlib.h>

//先定义链表里面的元素。
typedef struct node{
    int data;
    struct node *next;
}MyNode;

//定义整个链表。
typedef struct link{
    MyNode *head;//把head指向的元素定为第一个元素。
}MyLink;


int isEmpty_to_MyLink(MyLink *myLink);//判断链表是否为空。
int push_to_MyLinkInHead(MyLink *myLink,int m);//向链表头添加元素值为m的元素。
int insert_to_MyLink(MyLink *myLink,MyNode *myNode,int m);//向链表的myNode后面添加一个元素值为m的值。
int remove_to_MyLinkByValue(MyLink *myLink,int m);//删除链表中值为m元素。
int length_to_MyLink(MyLink *myLink);//判断链表的长度。
int isExistLoop_MyLink(MyLink *myLink);//判断链表是否有环。
void printMyLink(MyLink *myLink);//输出链表。



int isEmpty_to_MyLink(MyLink *myLink){
    if (myLink->head==NULL) {
        return 1;
    }
    return 0;
}

int push_to_MyLinkInHead(MyLink *myLink,int m){
    MyNode *tempNode=malloc(sizeof(MyNode));
    tempNode->data=m;
    tempNode->next=myLink->head;
    myLink->head=tempNode;
    free(tempNode);
    return 1;
}

int insert_to_MyLink(MyLink *myLink,MyNode *myNode,int m){
    MyNode *tempNode=malloc(sizeof(MyNode));
    tempNode->data=m;
    tempNode->next=myNode->next;
    myNode->next=tempNode;
    free(tempNode);
    return 1;
}

int remove_to_MyLinkByValue(MyLink *myLink,int m){
    if (isEmpty_to_MyLink(myLink)) {
        return 0;
    }
    int flag=0;
    while ((myLink->head)&&(myLink->head->next)) {
        if (myLink->head->next->data==m) {
            myLink->head=myLink->head->next;
            flag++;
        }
    }
    if ((myLink->head)&&(myLink->head->data==m)) {
        myLink->head=myLink->head->next;
        flag++;
    }
    if (flag>0) {
        return 1;
    }
    return 0;
}

int length_to_MyLink(MyLink *myLink){
    int myLength=0;
    while (myLink->head) {
        myLink->head=myLink->head->next;
        myLength++;
    }
   
    return myLength;
}

int isExistLoop_MyLink(MyLink *myLink){
    MyNode *tempNodeA=malloc(sizeof(MyNode));
    MyNode *tempNodeB=malloc(sizeof(MyNode));
    tempNodeA=myLink->head;
    tempNodeB=myLink->head;
    while ((tempNodeB) && (tempNodeB->next)) {
        tempNodeA=tempNodeA->next;
        tempNodeB=tempNodeB->next->next;
        if (tempNodeA==tempNodeB) {
            return 1;
        }
    }
    free(tempNodeA);
    free(tempNodeB);
    return 0;
}

void printMyLink(MyLink *myLink){
    if (isEmpty_to_MyLink(myLink)) {
        printf("链表为空\n");
        return;
    }
    MyNode *myNode = myLink->head;
    while (myNode) {
        printf("%d , ",myNode->data);
        myNode=myNode->next;
    }
}




int main(int argc, const char * argv[])
{

    //创建自己的链表。
    MyLink *myLink = malloc(sizeof(MyLink));
    myLink->head = NULL;
   
    //创建自己链表中的元素。
    MyNode *myNode = malloc(sizeof(MyNode));
    myNode->next=NULL;
    myNode->data=0;
   
    //判断链表是否为空。
    if (isEmpty_to_MyLink(myLink)) {
        printf("空链表\n");
    }
    else{
        printf("不是空链表\n");
    }
    //求得链表的长度。
    printf("链表的长度为 %d\n",length_to_MyLink(myLink));
   
    //向链表中指定位置插入一个元素。
    int temp = 10;

    //插入到链表的头部。
    if (push_to_MyLinkInHead(myLink, temp)) {
        printf("添加成功\n");
    }
    else{
        printf("添加失败\n");
    }
   
    //求得链表的长度。
    printf("链表的长度为 %d\n",length_to_MyLink(myLink));
   
    printMyLink(myLink);
    //删除某个值
    if (remove_to_MyLinkByValue(myLink, temp)) {
        printf("删除成功\n");
    }
    else{
        printf("删除失败\n");
    }
   
    //判断链表是否有环。
    if (isExistLoop_MyLink(myLink)) {
        printf("存在环\n");
    }
    else{
        printf("不存在环\n");
    }
   
    printMyLink(myLink);
   
    //求得链表的长度。
    printf("链表的长度为 %d\n",length_to_MyLink(myLink));
   
   
   
   
   
   
    free(myLink);
    free(myNode);
    return 0;
}

猜你喜欢

转载自zhangmingwei.iteye.com/blog/1777176