C语言链表

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"

typedef struct _Teacher
{
    int age;
    struct _Teacher *next;
}Teacher;

Teacher* create_teacher();
int print_teacher(Teacher * pHeader);
int add_teacher(Teacher * pHeader, int x, int y);
int del_teacher(Teacher *pHeader, int x);
int reverse_teacher(Teacher *pHeader);
int free_teacher(Teacher *pHeader);

//创建链表
Teacher* create_teacher()
{
    Teacher* pHeader = (Teacher*)malloc(sizeof(Teacher));
    if (pHeader == NULL)
    {
        printf("err:malloc pheader err");
        return NULL;
    }
    Teacher* pCur = NULL;
    pCur = pHeader;

    pHeader->age = 0;
    pHeader->next = NULL;
    int i = 0;
    while (1)
    {
        printf("please enter your age:");
        scanf("%d", &i);
        if (i == -1)
        {
            break;
        }
        Teacher* temp = (Teacher*)malloc(sizeof(Teacher));
        if (temp == NULL)
        {
            free_teacher(pHeader);
            return -1;
        }
        temp->age = i;
        temp->next = NULL;

        pCur->next = temp;
        pCur = temp;

    }
    return pHeader;
}
//读取链表
int print_teacher(Teacher * pHeader)
{
    if (pHeader == NULL)
    {
        printf("err print_teacher:pHeader=NULL");
        return -1;
    }
    Teacher * pCur = pHeader->next;

    while (pCur)
    {
        printf("%d ", pCur->age);
        pCur = pCur->next;
    }

}
//在age=x前面插入y,没有则插入到最后
int add_teacher(Teacher * pHeader, int x, int y)
{
    if (pHeader == NULL)
    {
        printf("err add_teacher:pHeader=NULL");
        return -1;
    }
    Teacher * pM = (Teacher *)malloc(sizeof(Teacher));
    if (pM == NULL)
    {
        free_teacher(pHeader);
        return -1;
    }
    pM->age = y;
    Teacher *pPre = NULL, *pCur = NULL;
    pPre = pHeader;
    pCur = pPre->next;

    while (pCur != NULL)
    {
        if (pCur->age == x)
        {
            break;
        }

        pPre = pCur;
        pCur = pCur->next;

    }
    pM->next = pCur;
    pPre->next = pM;

}
//删除链表节点
int del_teacher(Teacher *pHeader, int x)
{
    if (pHeader == NULL)
    {
        printf("err del_teacher:pheader==NULL");
        return -1;

    }
    Teacher *delT = NULL;
    Teacher *pPre = pHeader;
    Teacher *pCur = pHeader->next;
    while (pCur != NULL)
    {
        if (pCur->age == x)
        {
            delT = pCur;
            break;
        }
        pPre = pCur;
        pCur = pCur->next;

    }
    if (delT == NULL)
    {
        printf("\nnot found age=%d\n", x);
        return 0;
    }
    pPre->next = pCur->next;
    free(delT);
    return 0;

}
//释放内存
int free_teacher(Teacher *pHeader)
{
    Teacher *pCur = pHeader;
    Teacher *next = pCur->next;
    while (pCur != NULL)
    {
        next = pCur->next;
        free(pCur);
        pCur = next;
    }
    return 0;
}
//逆向链表
int reverse_teacher(Teacher *pHeader)
{
    if (pHeader == NULL)
    {
        printf("err del_teacher:pheader==NULL");
        return -1;

    }
    if (pHeader->next == NULL || pHeader->next->next == NULL)
    {
        return 0;
    }
    Teacher * pPre = pHeader->next, *pCur = pHeader->next->next,*temp =NULL;
    pPre->next = NULL;
    while (pCur != NULL)
    {
        temp = pCur->next;

        pCur->next = pPre;

        pPre = pCur;

        pCur = temp;

    }

    pHeader->next = pPre;
    return 0;

}
void main()
{
    Teacher * pHeader = NULL;
    pHeader = create_teacher();
    int res = 0;
    if (pHeader == NULL)
    {
        printf("err create_teacher");
        return;

    }
    //res = print_teacher(pHeader);

    //res = add_teacher(pHeader, 20, 19);

    //res = print_teacher(pHeader);

    //res = del_teacher(pHeader, 20);

    //res = print_teacher(pHeader);
    res =reverse_teacher(pHeader);

    res = print_teacher(pHeader);
    res = free_teacher(pHeader);

    system("pause");

}
时间: 2024-11-05 14:55:46

C语言链表的相关文章

C语言-链表

单向链表:结构体非常适合链表结构,链表的组成:head指针.数据块节点指针p->nest.结束指针NULL. 链表操作:需要首先找到表头head指针.链表的操作包括动态链表的创建.顺序输出.删除节点.插入节点的操作. 动态存储操作函数:(ANSI规则返回的指针类型为void*,早期的为字符型指针) 分配一个块:void *malloc(unsigned int size)  //分配成功则返回指向起始地址的指针void * 分配多个块:void *calloc(unsigned n,unsign

关于c语言链表的操作

这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能..但是最近要考试了,所以没有写成菜单的形式..等考试完了,在进行补充吧.. 代码如下... #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int data; struct node *next; }; int main() { /*建立链表操作*/ int n,x,p

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 name,性别 sex 和成绩 score 等.另一个域为指针域,存放下一结点的首地址.链表中的每一个结点都是同一种结构类型. 指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域. 在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域

c语言链表和指针的运用

在学习指针之前,首先要认识指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值.当用在声明一个变量时,*表示这里声明了一个指针.其它情况用到*表示指针的取值.&是地址操作符,用来引用一个内存地址.通过在变量名字前使用&操作符,我们可以得到该变量的内存地址.

C语言链表的来源分析

C语言中的链表是重点,也是难点,而且意义非凡.对链表的的抽象和恐惧是源于对它的来龙去脉的不明白.所以很有必要对它的发展渊源做透彻分析. 链表的单位是节点,而节点源于复合数据类型:结构体: 节点和结构体的区别就是看是否有指针域,目的就是想找到下一个节点: 结构体形如: struct Ghost { char name[30]; int age; int height; char addr[30]; }; 节点形如: struct Ghost { char name[30]; int age; in

注释最全的C语言链表的增删改查

1 //这是C语言的写法,但会报错,原因是len(当前的节点长度) 2 //无法在insert(插入)和deleted(删除)之后改变 3 //不能使用delete是因为delete是C++中的一个运算符 4 //最终我把改程序用C++写了一遍,运用引用将len的真实值改变了 5 #include <stdio.h> 6 #include <stdlib.h> 7 typedef int ElementType; 8 typedef struct node { 9 ElementT

C语言----------链表的简单操作

#include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 struct node *next; //指针域 }linklist; linklist* Create(){ //创建链表 char key; linklist *phead; //头指针 linklist *pnew; //新节点 linklist *pend; //尾指针 phead = (linklist

C语言链表的简单实用

// //  ViewController.m //  链表 // //  Created by 张凯泽 on 16/1/26. //  Copyright © 2016年 rytong_zkz. All rights reserved. // #import "ViewController.h" /* static 关键字的作用: (1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值: (2)在

C语言 链表排序

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 5 typedef struct node{ 6 int data; // 存放数据 7 struct node* next; // 下一节点 8 }ListNode; 9 10 extern int CSort(); 11 12 ListNode *root = NULL;// 13 14 int main(int argc, char