复习下C 链表操作(单向链表)

Object-C 作为C 的包装语言(运行时、消息机制)。如果不熟悉C 的话实在玩得太肤浅。 随便深入oc 内部都会接触到C。

runtime 、GCD、Block、消息机制。。。

所有强大的功能无不用的 包装体(struct 结构体)。使用GCC/Clang (可以google 下。Clang 比GCC 更优化,) 编译指令。 转换OC 为 C 。

终端 使用Clang 命令参考

clang -rewrite-objc file.m

查看file.cpp 文件为编译转换的C

单向链表 创建 、插入 、反转

 //struct
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Student_st
{
    char name[10];
    int  point;
   struct Student_st *stu;
} Student;

void CheckIsLinkTable(Student *student){
    Student *next = student->stu;
    if (next == NULL) {
        printf("查询失败,不是链式结构\n");
        exit(0);
    }
}

Student * CreateLink_Table(int num){
    printf("num is %d\n",num);

    Student * head,*current,*temp;
    //分配内存
    head = (Student *)malloc(sizeof(Student));
    if (head == NULL) {
        printf("内存分配失败 \n");
        exit(0);
    }

    head ->name[0] = ‘\0‘;
    head ->point = 0;
    head -> stu = NULL;

    temp = head;
    for (int i = 0; i< num; i++) {
        current = (Student *)malloc(sizeof(Student));
        if (current == NULL) {
            printf("内存分配失败 \n");
            exit(0);
        }
        current ->stu = NULL;

        printf("请输入第%d位学生姓名和成绩 如:name|89 \n",i+1);
        char stuName[10] = "未知";
        int student_point = 0;
        char argValue[15] = "未知";

        scanf("%s",argValue);

        if (strstr(argValue,"|")==NULL) {
            printf("请使用|分割内容 Y|N Y 重新输入,N 退出\n");
            char content[5];
            scanf("%s",content);
            if (strcmp(content,"Y")==0) {
                scanf("%s",argValue);
            }else{
                exit(0);
            }
        }

        //分割字符串
        char *token;

        token = strtok(argValue,"|");
        int i = 0;
        while (token != NULL) {
            if (i>0) {
                student_point = atoi(token);
                printf("%d\n",student_point);
            }else{
                ////char*的值赋给数组怎么做?----> c是常量指针,不可以改变,用
                strncpy(stuName,token,sizeof(stuName));
                printf("%s\n",token);
            }

            token = strtok(NULL,"|");
            i++;
        }
        strncpy(current->name,stuName,sizeof(current->name));
        current ->point = student_point;

        current->stu = NULL;
        temp ->stu = current;
        temp = current;

    }

    return head;
}

//查询
void selectStudent(Student *student){
    CheckIsLinkTable(student);

    Student *next = student->stu;
    int i =0;
    while (next) {
        printf("index %d; studentName is %s;  point is %d\n",i+1,next->name,next->point);
        next = next ->stu;
        i++;
    }
}
//插入
Student * insertStudentLinkTable(Student *student,char *insertContent){
    //分割字符串
    if (!insertContent) {
        exit(0);
    }

    //分割字符串
    char *token;
    char stuName[10];
    char preStuName[10];
    int student_point;
    token = strtok(insertContent,"|");
    int i = 0;
    while (token != NULL) {
        if (i==1) {
            ////char*的值赋给数组怎么做?----> c是常量指针,不可以改变,用
            strncpy(stuName,token,sizeof(stuName));
            printf("%s\n",token);
        }else if(i==2){
            student_point = atoi(token);
            printf("%d\n",student_point);
        }else{
            strncpy(preStuName,token,sizeof(preStuName));
            printf("%s\n",token);
        }

        token = strtok(NULL,"|");
        i++;
    }
    Student *preStu;

    CheckIsLinkTable(student);
    //查找节点名字是否存在
    Student *next = student->stu;
    int ind = 0;
    while (next) {
        if ((next->name) && strcmp(preStuName,next->name)==0) {
            printf("找到节点%s 位于第%d个节点 开始插入节点\n",preStuName,ind+1);
            preStu = next;
            break;
        }
        next = next->stu;
        ind++;
    }

    Student *nextStu = preStu->stu;
    //创建节点
    Student *newStu = (Student *)malloc(sizeof(Student));
    if (newStu==NULL) {
        printf("分配内存失败");
        exit(0);
    }
    strncpy(newStu->name,stuName,sizeof(char[10]));
    newStu->point = student_point;
    newStu->stu = nextStu;

    preStu->stu = newStu;

    //查询节点
    selectStudent(student);
    return student;
}

//反转
Student *ReversionStudentLinkTable(Student *student){
    CheckIsLinkTable(student);

    Student *next,*current,*newLinkTable;
    next = NULL;
    current =NULL;
    newLinkTable = NULL;
    current = student->stu;
    while (current) {
        //保存游标节点 以后的节点
        next = current->stu;
        //断开游标节点后面的节点,并设置游标节点的后续节点为 新链表的第一个节点
        current->stu = newLinkTable;
        //保存当前游标节点 为新链表
        newLinkTable = current;
        //重置游标节点
        current = next;
    }

    //给游标节点添加 头节点
    Student *head = NULL;
    head = (Student *)malloc(sizeof(Student));
    head->name[0]=‘\0‘;
    head->point = 0;
    head->stu = newLinkTable;

    return head;
}
int main(void){
    char sf[15];

    /**
     *  创建单向链表
     */
    int num;
    printf ("请输入学生人数\n");
    scanf("%d",&num);
    Student *link_stu = CreateLink_Table(num);

    /**
     *  单向链表插入节点
     */
    printf ("请插入节点内容 在 已存在节点名字的后面,如 已存在节点名字|待插入名字|待插入分数 \n");
    scanf("%s",sf);

    link_stu = insertStudentLinkTable(link_stu,sf);

    /**
     *  反转单向链表
     */
    printf("反转链表Y|N \n");
    scanf("%s",sf);
    if (strcmp(sf,"Y")==0) {
       Student *newLt= ReversionStudentLinkTable(link_stu);
        //查询
        selectStudent(newLt);
    }     return 0; }

 
时间: 2024-08-24 05:41:37

复习下C 链表操作(单向链表)的相关文章

再谈单向链表操作——单向链表的访问与修改

链表的访问 既然理解了链表的构成,对链表的访问也就不成问题了.不过要特别注意的是,对于数组,我们可以利用下标直接访问任何一个元素(这被称为"随机访问"),而对于单向链表,只能从头结点开始,依次进行"顺序访问". 假设我们已经按照前文创建了一个链表,下面我们设计一个函数,查找是否存在某数据: //参数说明:p为头指针,n为所查找的数据 void search_node(l* p, int n) { //若非尾结点,则继续循环 while(p->next != N

python数据结构链表之单向链表

本文和大家分享的主要是python中单向链表相关内容,一起来看看吧,希望对大家学习python有所帮助. 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. . 表元素域elem用来存放具体的数据. . 链接域next用来存放下一个节点的位置(python中的标识) . 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点. 节点实现 class 

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始

操作单向链表

今天比较忙   晚上回来匆匆打了部分  明天继续  函数内注释都是按自己的理解打的 1 #include "stdio.h" 2 #include "string.h" 3 typedef struct Node 4 { 5 DATA date; 6 struct Node *next; 7 }ChainListType; 8 9 ChainListType *ChinaListAddEnd(ChainListType *head,DATA data); 10 //

链表操作---找到链表的中点

在很多链表的算法中,常常需要找到链表的中点. 这里给出一种使用双指针,一次遍历链表就能找到链表中点的方法. 使用一个快指针,每次走两步,一个慢指针,每次走一步.等快指针走到链表底部的时候,慢指针正好走到中点. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ ListN

线性表的Java实现--链式存储(单向链表)

线性表的Java实现--链式存储(单向链表) 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在插入.删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢. 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理.但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空

数据结构-线性表之单向链表--一点一滴

单向链表 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址.分为动态单向链表和静态单向链表.单向链表也可以根据是否带头节点分为带头节点结构和无带头节点结构.我们把指向单链表的指针为头指针.头指针所指的不存放数据元素的第一个节点称作头节点.存放数据元素的节点成为第一个数据元素节点. 注:第一个数据元素节点在带头节点单链表中是第二个节点:而在不带头节

Python3中定义一个单向链表

链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我们定义链表,就是要定义链表中的节点,对链表的操作最后也就是对节点的操作. 这些包含数据的节点们在一种指定的结构下连接起来,成为了一种数据结构——单向链表.以上是我对单向链表的理解. 以下是我用python3对单向链表这种数据结构的一种实现: ''' Python3版单向链表-单向链表简称单链表 单链表中所包含的基本操作: 初始化

10、单链表操作

单链表操作 单链表操作1 /*单链表的类型定义*/ typedef int DataType; typedef struct node { DataType data; struct node * next; }LinkNode, *LinkList; /*单链表的定位运算*/ LinkNode *Locate(LinkNode *L, int k)//????为什么此处是LinkNode *Locate()类型,表示什么意思 { LinkNode *p; int i; i= 1; p = L-

单链表,双链表,循环链表的区别

单向链表(单链表) 单向链表,它包含两个域,一个信息域和一个指针域.这个链接指向表中的下一个节点,而最后一个节点则 指向一个空值NULL. 单向链表只可向一个方向遍历. 查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置.也可以提前把一个节点的位置另外保存起来,然后直接访问. 双向链表,(双链表) 双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针.第一个节点的"前连接"指向NULL,最后一个节点的"后连接"指向NULL. 这