C语言 之 链表

来源:互联网 发布:单片机lcd显示时间 编辑:程序博客网 时间:2024/05/22 08:15

链表

      数据项:结构体表示

      地址项:指向下一个成员地址

创建节点和往头部插入节点:

[root@Abel list]# cat list.h

#ifndef _LIST_H#define _LIST_H#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct link{int data;struct link *next;}node ;node* create_list();int insert_hlist(node* head, int data);#endif

[root@Abel list]# cat list.c

#include"list.h"node* create_list(){node* head = (node*) malloc(sizeof(node));if(NULL == head){printf("NULL\n");exit(1);}head->data = 0;head->next = NULL;return head;}int insert_hlist(node* head, int data){if(NULL == head){perror("head is NULL\n");return -1;}node* new = (node*)malloc(sizeof(node));if(NULL == new){perror("malloc error\n");return -1;}new->next = head->next;new->data = data;head->next = new;return 0;}


 

[root@Abel list]# cat main.c

#include"list.h"int main(){node* head = create_list();printf("head -> data = %d\nnext = %p\n", head->data, head->next);int result = insert_hlist(head, 100);printf("result = %d\n", result);return 0;}


 

插入多个节点:

[root@Abel list]# cat main.c

#include"list.h"int main(){int i, result;int array[10] = {1,2,3,4,5,6,7,8,9,10};for(i = 0; i < 10; i++){result = insert_hlist(head, array[i]);printf("result = %d\n", result);}return 0;}


 

打印(遍历)链表内容函数:

void find_alist(node* head){if(NULL == head){perror("head is NULL\n");exit(-1);}node* temp = head->next;while(NULL != temp){printf("%d ,", temp->data);printf("%p, ", temp->next);temp = temp->next;}putchar('\n');}


 

从链表尾部插入:int insert_tlist(node* head, int data){        if(NULL == head)        {                perror("head is NULL\n");                return -1;        }        node* new = (node*)malloc(sizeof(node));        new->data = data;        node* tmp = head;        while(tmp->next != NULL)                tmp = tmp->next;        new->next = tmp->next;//      new->next = tmp; 会断链        tmp->next = new;        return 0;}从第i个插入数据:node* find_ilist(node* head, int i){        if(NULL == head)        {                perror("head is null\n");                exit(-1);        }        int j = 0;        node* tmp = head;        while(j < i && tmp->next != NULL)  //进入的条件        {                j++;                tmp = tmp->next;        }        if(j == i)  //有这么多个节点                return tmp; //返回数据的地址        return NULL;}在指定的节点上插入指定的数据:int insert_ihlist(node* head, int data, int i){if(NULL == head){perror("head is NULL\n");return -1;}node* tmp = find_ilist(head, i);if(NULL == tmp){perror("tmp is NULL\n");return -1;}node* new = (node*)malloc(sizeof(node));if(NULL == new){perror("new malloc error\n");return -1;}new->data = data;new->next = tmp->next;tmp->next = new;return 0;}查找指定链表内指定数据的大小:node* find_vlist(node* head, int data){        if(NULL == head)        {                perror("head is null\n");                return NULL;        }        node* tmp = head;        while(tmp != NULL)        {                //if(tmp->data == data)  正确              if(!memcmp(&tmp->data, &data, sizeof(data))) // 正确                {                        return tmp;                }                tmp = tmp->next;        }        return NULL;t}删除链表的头:int delete_hlist(node* head){        if(NULL == head)        {                perror("head is null");                return -1;        }        //node* temp = head->next;        //head->next = temp->next;        //free(temp);        head->next = head->next->next;        free(head);        return 0;}删除链表结尾:int delete_tlist(node* head){        if(NULL == head)        {                perror("head is null\n");                return -1;        }        node* current, *before;        current = before = head;        while(NULL != current->next)        {                before = current;                current = current->next;        }        before->next = NULL;        free(current);        return 0;}删除链表中第i个节点:int delete_ilist(node* head, int i){        if(NULL == head)        {                perror("head is null\n");                return -1;        }        /*int j=0;        node*before, *current;        before = current = head;        while(j < i && current->next != NULL)        {                j++;                before = current;                current = current->next;        }        if(j == i)        {                before->next = current->next;                free(current);                return 0;        }return -1;*/        node* tmp = find_ilist(head, i-1); //先找到前一个        if(NULL == tmp)                return -1;        node* current = tmp->next; //再找当前节点        tmp->next = current->next; //前一个指向当前节点        free(current); //释放当前节点        return 0;}安全检测,让整个程序在段错误时正常运行删除整个链表:int delete_alist(node** head){        if(NULL == *head)        {                printf("head is null\n");                return -1;        }        node* after, *current;        after = current = *head;        while(current != NULL)        {                after = current->next;                free(current);                current = after;        }        *head = NULL;        return 0;}
1、循环链表:最后一个链表指向头节点,任意一个节点都可作为头节点。2、[root@Abel cirlist]# gcc mian.c cirlist.c -o cirlistmian.c: 在函数‘main’中:mian.c:5: 警告:初始化时将整数赋给指针,未作类型转换这种错误因为初始化与调用的不一样3、创建循环链表:node* create_cirlist(){node* head = (node*)malloc(sizeof(node)); //动态分配内存if(NULL == head){perror("head is null\n");exit(-1);}head->data = 0;head->next = head;return head;}4、从循环链头部表插入:int insert_hcirlist(node* head, int data){ERROR(head, -1);node* new = (node*)malloc(sizeof(node));//给需插入的节点分配内存new->data = data; //节点数据new->next = head->next;//改变指向head的下一个节点的指针head->next = new; //head指向新节点return 0;}5、遍历循环链表头文件中的函数声明void show_node(node* n);//显示函数typedef void (*show_fun)(node* n);//自定义指针函数类型int find_alist(node* head, show_fun f);//函数实现void show_node(node* n){if(n == NULL){perror("node is null\n");return ;}printf("%d ", n->data);}int find_alist(node* head, show_fun f){ERROR(head, -1);node* tmp = head->next;while(head != tmp){f(tmp);tmp = tmp->next;}f(tmp);return 0;}删除头节点:int delete_hlist(node* head){ERROR(head, -1);node* tmp = head->next; //指向head的下一个head->next = tmp->next; //head的下一个指向head的下一个的下一个free(tmp);}删除尾节点:int delete_tlist(node* head){ERROR(head, -1);node* current = head, *before = head;while(current->next != head){before = current;current = current->next;}before->next = head;free(current);}删除第i个节点int delete_ilist(node* head, int i){ERROR(head, -1);node* before, *current;before = current = head;int j = 0;while((j < i) && (current->next != head)){j++;before = current;current = current->next;}if(j == i){before->next = current->next;free(current);return 0;}return -1;}链表的合并:node* union_list(node* head1, node* head2){//不同情况if(NULL == head1 && NULL == head2)return NULL;if(NULL == head1 && NULL != head2)return head2;if(NULL != head1 && NULL == head2)return head1;//找到第一个链表的尾node* tmp1 = head1->next;while(tmp1->next != head1)tmp1 = tmp1->next;//找到第二个链表的尾node* tmp2 = head2->next;while(tmp2->next != head2)tmp2 = tmp2->next;//链表一的尾到链表二的头的下一个,链表二的尾指向链表一的头,释放掉链表二的头tmp1->next = head2->next;tmp2->next = head1;free(head2);return head1;}双向循环链表创建双向循环链表:[root@Abel doublelist]# cat doublelist.c#include "doublelist.h"node* create_list(){node* head = (node*)malloc(sizeof(node));ERROR(head, NULL);head->after = head->before = head;head->data = 0;return head;}从头部插入节点:int insert_hlist(node* head, int data){ERROR(head, -1);//动态分配内存node* new = (node*)malloc(sizeof(node));ERROR(new, -1);node* after = head->after; //中间变量new->before = after->before; //指向头节点的后继new->after = after; //指向下一个节点的前区after->before = new; //消除之前after指向headhead->after = new;//消除之前head指向afternew->data = data; //数据处理return 0;}从链表尾部插入:int insert_tlist(node* head, int data){ERROR(head, -1);node* new = (node*)malloc(sizeof(node));ERROR(new, -1);node* end = head->before;new->before = end;new->after = end->after;end->after = new;head->before = new;new->data = data;return 0;}从头遍历双向链表里的数据:int find_alist(node* head){ERROR(head, -1);node* current = head->after;while(current != head){printf("%d ", current->data);current = current->after;}printf("\n");return 0;}从尾部遍历双向循环链表:int find_talist(node* head){ERROR(head, -1);node* current = head->before;printf("%d ", head->data);while(current != head){printf("%d ", current->data);current = current->before;}printf("\n");return 0;}删除双向循环链表的头节点int delete_hlist(node* head){ERROR(head, -1);node* current = head->after;node* after = current->after;head->after = after;after->before = head;free(current);return 0;}

链表第i个节点数据更新:int updata_ilist(node* head, int newdata, int i){ if(NULL == head) { perror("head is null\n"); return -1; }/* int j = 0; node* tmp = head; while(j < i && tmp != NULL) { j ++; tmp = tmp->next; } if(j == i) { tmp->data = newdata; return 0; } return -1;*/ node* tmp = find_ilist(head, i); tmp->data = newdata; return 0;}链表所有数据更新:int updata_alist(node* head, int newdata){ if(NULL == head) { perror("head is null\n"); return -1; } node* tmp = head; while(tmp != NULL) { tmp->data = newdata; tmp = tmp->next; } return 0;


 

原创粉丝点击