19 链表基本操作

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>       //exit 函数需要
#include <malloc.h>

typedef struct node
{
    struct node* pNext;
    int data;            
}*PNODE,NODE;               //PNODE ==struct node *  ,       NODE==struct node

//函数原型
PNODE  create_list(void);
bool is_empty(PNODE);
void traverse_list(PNODE);
int lenth_list(PNODE);
bool insert_list(PNODE, int val, int index);
bool delete_list(PNODE, int index, int* val);
void sort_list(PNODE);

//测试程序 main() { PNODE pHead = NULL; //定义空指针;    pHead = create_list();
    is_em = is_empty(pHead);
    //insert_list(pHead, 11, 3);
    delete_list(pHead, 2, &delval);
    traverse_list(pHead);
    printf("\n  delval=%d", delval); } PNODE create_list(
void) { int len; int i; int val; PNODE pHead = (PNODE)malloc(sizeof(NODE)); //动态申请一个NODE的内存,pHead指向这个内存 ① PNODE pTail = pHead; // pHead复制一个, pTail开始创造list ② pTail->pNext = NULL; //pTail后面没有结点,现在有两个结点,没数据 ③ if (NULL == pHead) { //内存申请失败 printf("Creat list ERROR !! "); } printf("Please Enter the Lenth of the List , Lenth= "); scanf_s("%d", &len); for (i = 0; i < len; i++) { PNODE pNew= (PNODE)malloc(sizeof(NODE)); // 申请一个new NODE的内存 ④ printf("Please the %dth Value of List : ",i+1); scanf_s("%d", &val); pNew->data = val; //链表赋值 ⑤ pTail->pNext = pNew; //pNew连上pTail ⑥ pNew->pNext= NULL;     //       pTail = pNew; //pNew 变成pTail ⑧ } return pHead ; }
bool is_empty(PNODE pHead) { bool is_em = false; if (NULL == pHead->pNext ) is_em = true; return is_em; } void traverse_list(PNODE pHead) { int len=0; PNODE p; if (is_empty(pHead)) printf("The list is Empty!! \n"); else { p = pHead->pNext; do { printf("%d", p->data); p = p->pNext; len++; } while (p!= NULL); } printf("\nList lenth =%d ", len); }

创建链表算法:

 

bool insert_list(PNODE pHead, int val, int index) {
    PNODE p = pHead;
    int i = 0;

    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    while (NULL != p && i < index - 1) {
        p = p->pNext;
        i++;
    }

    if (NULL == p || i < index - 1)
        return false;
    pNew->data = val;
    pNew->pNext = p->pNext;
    p->pNext = pNew;
}

bool delete_list(PNODE pHead, int index, int* val) {
    PNODE p = pHead;
    PNODE r;
    int i = 0;
    *val = -1;       //如果删除失败val就为-1,还是有点问题
    while (NULL != p->pNext && i < index - 1) {
        p = p->pNext;
        i++;
    }

    if (NULL == p->pNext || i > index - 1) 
        return false;


    //先让r指向要删除的node,然后free r,防止内存泄漏
        //三个node顺序为  p---要删除的(r)--- r->pNext

        r = p->pNext;
        *val = r->data;                //带回删除的数
        p->pNext = r->pNext;
        //    p->pNext = p->pNext->pNext;
        free(r);
        r = NULL;

 

posted @ 2020-06-03 01:27  abel2020  阅读(104)  评论(0编辑  收藏  举报