C语言复习第六章:循环链表

    技术2024-07-07  71

    1.带有节点的循环链表

    与普通的带头结点链表相比,循环链表在做删除,销毁,遍历等操作时 主要是看最后一个节点的指针域是否指向头结点;

    #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }node; node *head = NULL; static node head_sentinel={0,NULL}; int init_link() { head = &head_sentinel; head_sentinel.next = head; } node *mk_node(int data) { node *p = (node *)malloc(sizeof(node)); if(p == NULL) { printf("malloc fair\n" ); exit(1); } p->data = data; p->next = NULL; return p; } int free_node(node *p) { free(p); } int head_insert(node *p)//头结点头插法 { p->next = head->next; head->next = p; } node *find_data(int data) { node *pre = head->next; while(pre != head) { if(pre->data == data) { return pre; } pre = pre->next; } return NULL; } int delete_node(node *p) { if(p == head) { free_node(p); return ; } node *pre = head; while(pre->next != head) { if(pre->next = p) { pre->next = p->next; free_node(p); return 1; } pre = pre->next; } return 0; } int traverse() { node *pre = head->next; while(pre != head) { printf("%d ",pre->data); pre = pre->next; } printf("\n-----------------\n"); } int destroy()//不销毁头结点 { node *p = NULL; node *pre = head->next;//指向头指针 while(pre != head)//第一次释放的是头结点 { printf("destroy():%d ",pre->data); p = pre->next; delete_node(pre); free_node(pre); pre = p; } return ; } int main(int argc, char const *argv[]) { init_link(); node *p = mk_node(1); //头插法 1 head_insert(p); traverse(); p = mk_node(2); // 2 1 head_insert(p); traverse(); p = mk_node(3); // 3 2 1 head_insert(p); traverse(); p = mk_node(4); // 4 3 2 1 head_insert(p); traverse(); p = find_data(4); // 3 2 1 delete_node(p); free_node(p); traverse(); return 0; }
    Processed: 0.012, SQL: 9