复习下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;
}

 

 

 

 

 

 

posted @ 2014-11-25 15:54  hhhker  阅读(539)  评论(0编辑  收藏  举报