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;