簡單鏈表C語言實現
阿新 • • 發佈:2019-02-16
連結串列原理見連結
函式名取得不是很好,大家見諒。
list標頭檔案如下:
list.c檔案如下#ifndef __LIST_DEMO_H__ #define __LIST_DEMO_H__ #include <stdio.h> #include <malloc.h> typedef struct node{ int data; struct node* next; }node_t,*pnode_t; //-----------------------基礎----------------------------------- //建立並初始化頭節點 pnode_t create_list(); //建立一個數據為data的節點,並返回節點地址 pnode_t create_node(int data); //判斷連結串列是否為空連結串列(沒有資料節點) int list_empty(pnode_t head); //列印連結串列的所有資料節點 void print_list(pnode_t head); //-----------------------查詢------------------------------------ //查詢資料為data的節點,並返回節點的地址 pnode_t find_node(pnode_t head,int data); //最核心程式碼 //查詢資料為data的節點的前一個節點 pnode_t find_prev(pnode_t head,int data); //最核心程式碼 //-----------------------插入------------------------------------ //把new指向的節點插入到p指向的節點後面 int insert_node_after(pnode_t p,pnode_t new); //最核心程式碼 //在p指向的節點後面插入一個數據為data的節點 int insert_data_after(pnode_t p,int data); //把new_data插入到資料為data的節點後面 int insert_data(pnode_t head,int data,int new_data); //把new_data插入到資料為data的節點的前面 int insert_prev(pnode_t head,int data,int new_data); //-----------------------刪除------------------------------------ //刪除p指向的節點後面的節點 int del_after_node(pnode_t p); //最核心程式碼 //刪除資料為data的節點後面的節點 int del_after_data(pnode_t head,int data); //刪除連結串列中資料為data的節點 int del_data(pnode_t head,int data); //刪除連結串列中的所有資料節點 int clear(pnode_t head); //銷燬連結串列(刪除所有資料節點和頭節點) int destroy(pnode_t *phead); #endif
#include <stdio.h> #include <malloc.h> #include "list_demo.h" //-----------------------基礎----------------------------------- pnode_t create_list() { pnode_t head = malloc(sizeof(node_t)); if(head != NULL) { head->data = 0; head->next = NULL; } return head; } pnode_t create_node(int data) { pnode_t p = (pnode_t)malloc(sizeof(node_t)); if(p != NULL) { p->data = data; p->next = NULL; } return p; } int list_empty(pnode_t head) { if(head == NULL) { return -1; //連結串列不存在 } if(head->next == NULL) { return 1; //連結串列為空 } else { return 0;//連結串列非空 } } void print_list(pnode_t head) { pnode_t tmp = NULL; if(head == NULL) { puts("list is not exist!\n"); return; } if(list_empty(head)) { puts("list is empty!\n"); return; } tmp = head->next; while(tmp!=NULL) { printf("%d\n",tmp->data); tmp = tmp->next; } return; } //-----------------------查詢------------------------------------ pnode_t find_node(pnode_t head,int data) { pnode_t tmp = NULL; if(head == NULL) { puts("no list\n"); return NULL; } tmp = head->next; while(tmp!=NULL) { if(tmp->data == data) { break; } tmp = tmp->next; } return tmp; } pnode_t find_prev(pnode_t head,int data) { pnode_t tmp = NULL; if(head == NULL) { puts("no list\n"); return NULL; } tmp = head; while(tmp->next!=NULL) { if(tmp->next->data == data) { return tmp; } tmp = tmp->next; } return NULL; } //-----------------------插入------------------------------------ int insert_node_after(pnode_t p,pnode_t new) { if(p == NULL || new == NULL) { return -1; } new->next = p->next; p->next = new; return 0; } int insert_data_after(pnode_t p,int data) { int ret = 0; pnode_t new = NULL; if(p == NULL) { return -1; } new = create_node(data); ret = insert_node_after(p,new); return ret; } int insert_data(pnode_t head,int data,int new_data) { int ret = 0; pnode_t p = NULL; p = find_node(head,data); if(p==NULL) { return -1; } ret = insert_data_after(p,new_data); return ret; } int insert_prev(pnode_t head,int data,int new_data) { int ret = 0; pnode_t p = NULL; p = find_prev(head,data); if(p==NULL) { return -1; } ret = insert_data_after(p,new_data); return ret; } //-----------------------刪除------------------------------------ int del_after_node(pnode_t p) { pnode_t tmp = NULL; if(p == NULL) { return -1; } tmp = p->next; if(tmp!=NULL) { p->next = tmp->next; free(tmp); } return 0; } int del_data(pnode_t head,int data) { int ret = 0; pnode_t p = find_prev(head,data); if(p != NULL) { ret = del_after_node(p); } return ret; } int del_after_data(pnode_t head,int data) { int ret = 0; pnode_t p = find_node(head,data); if(p != NULL) { ret = del_after_node(p); } return ret; } int clear(pnode_t head) { if(head == NULL) { return -1; } while(head->next != NULL) { del_after_node(head); } return 0; } int destroy(pnode_t* phead) { if(phead == NULL) { return -1; } if(*(phead) != NULL) { clear(*phead); free(*phead); } *phead = NULL; return 0; } int main() { int i = 0; int ret = 0; pnode_t head = NULL; head = create_list(); for(i = 0;i<5;i++) { insert_data_after(head,i*3); } print_list(head); printf("-----------------\n"); insert_data(head,3,2); insert_prev(head,6,5); print_list(head); printf("----------------\n"); del_data(head,5); del_data(head,2); print_list(head); destroy(&head); return 0; }