单向链表的基本应用-增删改查

一、单向链表功能函数初始化

/*********************************************/ /*demon:单向链表author:乐乐*/ /********************************************/

typedef char data_t; //1.定义单向链表结构体 typedef struct node_t { data_tdata; struct node_t *next; }linknode_t,*linklist_t;

//2.创建链表 linklist_t Creat_link(void) { linklist_t football_list; football_list = (linklist_t)malloc(sizeof(linknode_t)); //切记申请空间 if(NULL == list) { printf("malloc error\n"); return NULL; } football_list->next= NULL; return football_list; }

二、插入数据
//3.尾插 int InsertLink_End(linklist_t end, data_t data) { linklist_t new ; new = (linklist_t) malloc(sizeof(linknode_t)); if(NULL == new) { printf("InsertLinkEnd: malloc error\n"); return 0; } while(end->next != NULL) { end = end->next; //循环到尾部节点 } new->data = https://www.it610.com/article/data; new->next = NULL; end->next = new; //使尾节点指向要插入的节点 return 1; }

//4.获得链表中第pox节点首地址 //pox:要获取的节点位置 linklist_t GetLink(linklist_t list, int pos) { linklist_t p = list; int i; for(i = 0; i < pos; i++) { if(p == NULL) return NULL; p = p->next; } return p; }

//5.在指定pox位置插入新节点 //思想:找到要插入位置的前一个节点,使前一个节点的next指向插入的新节点,新节点的next指向要插入位置的节点数据 int InsertLink_Any(linklist_t list,int pos, data_t data) { linklist_t before = list; linklist_t new; before = GetLink(list, pos-1); // 找插入位置前一个节点 if(NULL == before) return -1; new = (linklist_t)malloc(sizeof(linknode_t)); if(NULL == new) { printf("InsertLinkAny malloc error\n"); return 0; } new->data = https://www.it610.com/article/data; new->next = before->next; // 插入数据的next指向该位置之前的next指向的节点 before->next = new; //插入位置之前的next指向要插入的节点new return 1; }

//6.删除链表中指定位置节点 int DeleteLink_Any(linklist_t list, int pos) { linklist_t before, p; before = GetLink(list, pos-1); if(before != NULL && before->next != NULL)//确保删除的不是头尾 { p = before->next; before->next = p->next; // 删除操作 free(p); //释放要删除的节点 return 1; } else { return 0; } }

//7.修改指定位置的数据 int UpdateLink(linklist_t list, int pos,data_t value) { linklist_t p = GetLink(list, pos); //获得链表中第pox节点首地址 if(NULL == p)//确保修改的原数据不为空 return 0; p->data = https://www.it610.com/article/value; return 1; }

//8.链表的长度 int Get_Len(linklist_t list) { linklist_t p = list->next; int len = 0; while(p != NULL) { p = p->next; len++; } return len; }

//9.释放链表所有节点空间 void Free_Link(linklist_t list) { linklist_t p = list->next; //p指向次节点 while(p != NULL) { list->next = p->next; free(p); //释放p指向的节点 p = list->next; } free(list); //释放头节点 }

//10.遍历链表 void ShowLink(linklist_t list) { linklist_t p = list->next; while(p != NULL) { printf("%c -- ", p->data); p = p->next; // p指向下一个节点 } printf("\n"); }

int main() { linklist_t list = CreateLink(); //创建链表 InsertLink_End(list, 'A'); //第一个元素是A InsertLink_End(list, 'B'); //第二个元素是B InsertLink_End(list, 'C'); //第三个元素是C ShowLink(list); //打印A-B-C InsertLink_Any(list, 2, 'D'); //在第二个位置插入D ShowLink(list); //打印A-D-B-C printf("link len = %d\n",GetLen(list)); //打印表长 DeleteLink_Any(list, 2); //删除第二个位置数据 ShowLink(list); //打印A-B-C UpdateLink(list, 3, 'E'); //将第三个位置的C替换为E ShowLink(list); //打印A-B-E FreeLink(list); //释放链表,使用完一定要释放,避免内存泄漏 return 0; }

【单向链表的基本应用-增删改查】运行结果
单向链表的基本应用-增删改查
文章图片

    推荐阅读