C语言之单向链表

1,单向链简洁。
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指列表中的下一个结点;
?
列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针;

2,例子要求:
根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入、删除以及查找,并支持单向链表的反转;

3,代码实现。
#include <stdio.h>
#include <math.h>
#include <cstring>
#include <memory.h>
#include <malloc.h>

//节点的定义
typedef struct Node {
    void *data; //数据域 //链域
    struct Node *next;
} NodeStruct, *pNode;

pNode head = NULL;

typedef char (*pCompareFunc)(void *a, void *b);
typedef void* (*pChar)(void *p);

// 字符串判断
int str_compare(void *a, void *b) {
    char *pa = (char*)a;
    char *pb = (char*)b;
    return strcmp(pa , pb);
}

// 分配一个节点
pNode allocate_node(void *data, pChar char_func) {
    pNode node = allocate();
    node->data = char_func(data);
    return node;
}

// 创建节点
pNode allocate() {
    void *p = malloc(sizeof(NodeStruct));
    pNode node = (pNode)p;
    node->next = NULL;
    node->data = NULL;
    return node;
}

// 添加一个节点
void insertNode(pNode node){
    if (head == null){
        head=node;
     }
     else {
        node->next = head;
        head = node;
     }
}

void* char_char(void *p) {
    char* pa = (char*)malloc(sizeof(char));
    memcpy(pa, p, sizeof(char));
    return pa;
}

// 初始化节点
pNode allocate_node(void *data, pChar char_func) {
    pNode node = allocate();
    node->data = char_func(data);
    return node;
}

// 释放资源
void free_list(pNode node) {
    pNode next = node;

while (next != NULL) {
        if (next->data != NULL)
            free(next->data);
        pNode temp = next;
        next = next->next;
        free(temp);
    }
}

// 1.1 添加一个节点
void insert(pNode node) {
    if (head == NULL)
        head = node;
    else {
        node->next = head;
        head = node;
    }
}

//1.2查找
int str_search(void* data,pCompareFunc compare){
    pNode next = head;
    pNode prev = NULL;
    while (next != NULL ) {
        if (compare(data, next->data) == 0) {
           // 如果查找到了,就退出返回1
           return 1;
           break;
        }
        prev = next;
        next = next->next;
    }
    // 如果一直查找不到,就返回0
    return 0;
}

// 1.3删除节点
void remove(void* data,pCompareFunc compare) {
    pNode next = head;
    pNode prev = NULL;
    while (next != NULL) {

if (compare(data, next->data) == 0) {
            if (prev == NULL) {
                head = next->next;
                next->next = NULL;
                free_list(next);
            } else {
                prev->next = next->next;
                next->next = NULL;
                free_list(next);
            }
            break;
        }
        prev = next;
        next = next->next;
    }

}

//1.4反转
void invert_order()
{
     node *This,*prev;
     p=head.next;
     This=NULL;
     while(p) {
             prev=This;
             This=p;
             p=p->next;
             This->next=prev;

}
     head.next=This;
}

void main(){
    // 1单向链表
    char a1[] = ‘aaa1‘;
    char a2[] = ‘aaa2‘;
    char a3[] = ‘aaa3‘;
    // 1.1添加
    insertNode(allocate_node(a1, init_char));
    insertNode(allocate_node(a2, init_char));
    insertNode(allocate_node(a3, init_char));
    // 1.2查找
    int flag = 0;
    flag = str_search(&a2,str_compare);
    // 1.3删除
    remove(&a2,str_compare);
    // 1.4反转
     invert_order();

}

----------------------------------------------------------------------------------------------------------------
<版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!>
原博客地址:  http://blog.itpub.net/26230597/viewspace-1386593/
原作者:黄杉 (mchdba)
----------------------------------------------------------------------------------------------------------------


时间: 2024-10-25 11:20:49

C语言之单向链表的相关文章

C语言反转单向链表的代码

学习过程中中,把内容过程中常用的内容片段做个珍藏,下边内容段是关于C语言反转单向链表的内容,应该能对大伙有较大用处. #include "stdafx.h" enum{N = 3};class Node{public:int var;Node(int i):pNext(NULL), var(i){}}; {if(pHead->pNext->pNext != NULL)helper(pHead->pNext, reverseHead);elsereverseHead =

C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //结构体声明 { long num; int score; struct Student* next; }; int n; struct Student* creat() //创建单向链表 { struct Student *head=NULL, *p_before, *p_later; p_before =

C语言之字符单向链表

/* * @Author: suifengtec * @Date:   2017-09-02 16:06:33 * @Last Modified by:   suifengtec * @Last Modified time: 2017-09-02 20:47:13 **/ /* 字符单向链表 gcc -o a.exe main.c && a  */ #include <stdio.h> #include <stdlib.h> #include <stdbool

写给过去的自己-No.1-数据结构篇-单向链表C语言的实现

过去的自己,你好.     今天我来教你单向链表,不知道你何时会看到这篇文章,也不知道你此刻对C语言的掌握,我会尽可能讲解细一点.     讲链表之前我先讲一下数组.相信你不管怎样肯定用过数组对吧,数组就是一种数据的组织形式,特点是所有的数据在逻辑上是顺序摆放的,通过数组名和数组下标 就可以找到某个元素,而且在内存中存放的物理地址也是连续的,定义数组时,一旦中括号中的数字确定了,数组中元素个数也就确定了.那么问题来了,因为数组 的大小需要提前确定,所以定义数组时必须统计好程序中用了多少元素,用多

C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1->2->5->3->4 相当于仅仅实现了插入.遍历2个功能(当然遍历功能稍微修改就是销毁链表了) 用纯C写了份测试代码 /* 基本数据结构的定义以及函数的声明 */ typedef int ElemType; typedef struct Node { ElemType elem; struc

C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。

// //  main.c //  dynamic_link_list // //  Created by ma c on 15/8/5. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:写一个函数建立有3名学生数据的动态单向链表,并输出链表中每个结点的所有内容. /* 建立动态链表的思想: 1.开辟一个新结点,并使p1,p2指向它: 2.读入一个学生数据给p1所指的结点: 3.head = NULL,n = 0; 4.判断读

C语言学习之单向链表操作

该文件为单向链表操作的一些接口:(如发现有错误的地方,及时告知,不胜感激!) list.h #ifndef  _CHAINLIST_H_ #define  _CHAINLIST_H_ typedef struct { char key[15]; char name[20]; int age; }DATATYPE_T; typedef struct Node { DATATYPE_T  data; struct Node *next; }chainListType; /* 添加节点到链表末尾 */

C语言 单向链表

1.单向链表的定义 struct student { char name[10]; float score; struct student *next; }; next作为同类型指针,指向与它所在节点一样的节点. 2.单向链表的基本操作 1)建立链表 int main() { /*定义结构指针,pnew指向新节点,head指向头节点,tail指向尾节点*/ struct student *pnew, *head, * ptail; /* 动态分配库函数malloc,分配长度为sizeof(str

c语言单向链表

一.链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.因此,head指向第一个元素:第一个元素又指向第二个元素:……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束.        链表的各