C语言实现常用数据结构——链表

#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int data;
    struct Node *next;
} node;

/*初始化链表:
1.首先给头指针分配空间,将头指针赋给temp
2.其次给每一个元素分配空间
3.将内容赋给当前节点的data,NULL赋给当前节点的next指针
4.把当前节点赋给(头指针)上一个节点的next指针
5.上一节点指针后移,准备初始化下个元素
6.最后返回当前链表的头指针*/
node *initnode() {
    int i;
    node *p = (node*)malloc(sizeof(node));
    node *temp = p;
    for (i = 0; i < 10; i++) {
        node *a = (node*)malloc(sizeof(node));
        a->data = i;
        a->next = NULL;
        temp->next = a;
        temp = temp->next;
    }
    return p;
}

/*指定位置插入元素:
1.将头指针赋给temp
2.temp一直遍历直到指定位置
3.给需要插入的元素分配空间,并将内容赋给分配好空间的元素
4.将插入位置的后一元素赋给要插入元素的next指针
5.将插入元素赋给temp的next指针
6.最后返回当前链表的头指针*/
node *insertElem(node *p, int elem, int pos) {
    int i;
    node *temp = p;
    for ( i = 0; i < pos; i++) {
        temp = temp->next;
    }
    node *c = (node*)malloc(sizeof(node));
    c->data = elem;
    c->next = temp->next;
    temp->next = c;
    return p;
}

/*删除指定位置的元素:
1.将头指针赋给temp
2.temp一直遍历直到指定位置
3.声明一个变量代表待删除节点
4.将待删除节点的下一节点赋给待删除节点的上一节点的next指针
5.释放待删除节点空间
6.最后返回当前链表的头指针*/
node *delElem(node *p, int pos) {
    int i;
    node *temp = p;
    for ( i = 0; i < pos; i++) {
        temp = temp->next;
    }
    node *c = temp->next;
    temp->next = c->next;
    free(c);
    return p;
}

/*查询指定元素的位置:
1.将头指针赋给temp
2.temp一直遍历直到temp节点的值等于要查询的元素
3.返回当前节点的index
4.如果链表遍历结束也未找到指定节点,返回-1
*/
int selectElem(node *p, int elem) {
    node *temp = p;
    int i = 0;
    while (temp->next) {
        temp = temp->next;
        if (temp->data == elem) {
            return i;
        }
        i++;
    }
    return -1;
}

/*更新链表指定节点的值*/
node *amendElem(node *p, int pos, int newElem) {
    int i;
    node *temp = p;
    for ( i = 0; i < pos; i++) {
        temp = temp->next;
    }
    node *amend = temp->next;
    amend->data = newElem;
    return p;
}

/*遍历链表*/
void display(node *p) {
    node *temp = p;
    while (temp->next) {
        temp = temp->next;
        printf("%d ", temp->data);
    }
    printf("\n");
}

//以下内容来自《数据结构与算法-C语言描述》
int IsEmpty(node *p) {
    return p->next==NULL;
}

int IsLast(node *pos,node *p) {
    return pos->next==NULL;
}

//删除指定位置的元素
node *Delete(node *p,int elem) {
    node *temp=p;
    node *tmp;
    while(temp->next) {
        if(temp->next->data==elem) {
            tmp=temp->next;
            temp->next=tmp->next;
            free(tmp);
        }
        temp=temp->next;
    }
    return p;
}

//在指定位置插入元素
node *Insert(node *p,int pos,int elem) {
    node *temp=p;
    int i;
    for(i=0; i<pos; i++) {
        temp=temp->next;
    }
    node *cell =(node*)malloc(sizeof(node));
    cell->data=elem;
    cell->next=temp->next;
    temp->next=cell;
    return p;
}
//删除list
void DeleteList(node *p) {
    node *temp=p;
    node *tmp;
    p->next=NULL;
    while(temp->next) {
        tmp=temp->next;
        free(tmp);
        temp=temp->next;
    }
}

int main() {
    node *p = initnode();
    display(p);
    printf("在第4的位置插入元素5:\n");
    p = Insert(p, 4, 5);
    display(p);
    printf("删除第3个元素:\n");
    p = delElem(p, 3);
    display(p);
    printf("查找元素2的位置为:\n");
    int address = selectElem(p, 2);
    if (address == -1) {
        printf("没有该元素\n");
    } else {
        printf("元素2的位子为:%d\n", address);
    }
    printf("更改第3的位置的数为7:\n");
    p = amendElem(p, 3, 7);
    display(p);
    printf("delete7\n");
    p=Delete(p,7);
    display(p);
    printf("删除\n");
    DeleteList(p);
    display(p);
}

原文地址:https://www.cnblogs.com/wangbin2188/p/9593669.html

时间: 2024-11-09 09:41:43

C语言实现常用数据结构——链表的相关文章

Java 集合框架(常用数据结构)

早在Java 2中之前,Java就提供了特设类.比如:向量(Vector).栈(Stack).字典(Dictionary).哈希表(Hashtable)这些类(数据结构)用来存储和操作对象组.虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.除了集合,该框架(framework)也定义了几个Map接口和类.Map里存储的是键/值对.尽管Map不是collections,但是它们完全整合在集合中. 所有的集合框架都包含如下内容:

常用数据结构及算法C#实现

常用数据结构及算法C#实现 1.冒泡排序.选择排序.插入排序(三种简单非递归排序) 1 int[] waitSort = { 1,0, 12, 13, 14, 5, 6, 7, 8, 9, 10 }; 2 3 //冒泡排序 4 int length = waitSort.Length; 5 6 for (int i = 0; i < length; i++) 7 { 8 for (int j = i + 1; j < length; j++) 9 { 10 if (waitSort[j] &g

【转】常用数据结构及复杂度

常用数据结构及复杂度 常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex Array (T[]) O(n) O(n) O(n) O(1) Linked list (LinkedList<T>) O(1) O(n) O(n) O(n) Resizable array list (List<T>) O(1) O(n) O(n) O(1) Stack (Stack<T>) O(1) - O(1) - Queue (Qu

Cocos2d-x 脚本语言Lua基本数据结构-表(table)

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在lua中table很好的实现了这些数据结构.--摘自:<Programming in Lua> 看以下代码,可以很清晰的明白Lua中表的使用: -- Lua中的表,table Config = {hello="Hello Lua",world="World"} -- 赋值方式1,以键=

常用数据结构及复杂度

常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex Array (T[]) O(n) O(n) O(n) O(1) Linked list (LinkedList<T>) O(1) O(n) O(n) O(n) Resizable array list (List<T>) O(1) O(n) O(n) O(1) Stack (Stack<T>) O(1) - O(1) - Queue (Queue<T>

Lua 常用数据结构

Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础.如数组.记录.线性表.队列和集合等,在Lua中都可以通过table来表示. 一.数组 在lua中通过整数下标访问表中的元素即可简单的实现数组.并且数组不必事先指定大小,大小可以随需要动态的增长. a = {} for i = 1,100 do a[i] = 0 end print("The length of array 'a' is " .. #a) squares = {1, 4, 9, 16, 25} pr

常用数据结构[转]

原文:http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex  Array (T[]) O(n) O(n) O(n) O(1)  Linked list (LinkedList<T>) O(1) O(n) O(n) O(n)  Resizable array list (List<T>) O(1) O(n) O(n) O(1)  

关于C语言的指针、链表的原理和各类操作

今天课上我们老师为我们讲述了c语言的指针.链表的原理以及各类操作. 一.指针 1.指针 指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 2.数

java 常用数据结构

本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.例如,Java提供日期(Data)类.日 历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack).向量 (Vector) .位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构. 图1.1给出了java.util包的基本层次结构图.下面我们将具体介绍其中几个重要的类. ┌java.util.BitS