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;
- C语言 之 链表
- C语言复习之---链表
- C语言之旅(11)链表
- C语言之四书五经
- C语言之四书五经
- C语言之四书五经
- C语言之数据类型
- C语言之指针
- C语言之解析
- C语言之诡异
- C语言之四书五经
- C语言之指针
- C语言之输入
- C语言之四书五经
- C语言之四书五经
- C语言之extern
- C语言之变量
- 基础之C语言
- linux chmod 详解
- 组合查询中一对单引号引起的悲剧
- 由system.currentTimeMillis() 获得当前的时间
- 一个高在线(可以超过1024)多线程的socket echo server(pthreads 和 libevent扩展)
- 输入算式求结果
- C语言 之 链表
- 两个有序链表合并为一个有序链表
- 黑马程序员-java前期基础笔记
- SetIcon
- 经典SQL语句大全
- 简单算术表达式的使用
- 课程设计
- 使用 Intel HAXM 为 Android 模拟器加速
- 实时传输协议RTP