C语言之链表list

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

//定义表示学生信息结点的结构体
typedef struct _student
{
   char name[20];
    float score;
    //定义指向链表中下一个结点的指针
    struct _student* next;
 }student;

 void printlist(student*);

 int main( )
 {
   //第一步:定义指向链表头和尾的指针
   student* head = NULL ;
   student* tail = NULL ;

   char name[20] = "" ;
   float score = 0.0f ;
   int i = 3;

   bool ishead = true;
   printf("input student name score\n");
   while(i--)
   {
       printf("this %d student\n",i);
       scanf("%s %f",name,&score);

      //第二步“:根据结点数据创立结点
      //首先,用malloc()函数动态申请内存,内存的大小就是一个结点的大小
      student* node = malloc(sizeof(student));  

      //然后将用户输入的数据保存到这个结点
      strcpy(node->name,name);
      node->score = score;

      //第三步:调整节点之间的指向关系
      //如果这是链表中的第一个结点。
      if(ishead)
      {
          //将指向链表首结点的head指向这个结点
          head = node ;
          //首结点尚无下一个结点
          head->next = NULL ;
          //当前结点就是链表的尾结点
          tail = node;

          //首结点已经处理完毕,下一个结点就是普通结点了
          ishead = false;
      }
      else
      {
          //将新结点添加到已有链表的末尾
          tail->next = node;
          //将新的结点作为新的尾结点
          tail = node;
      }
   }//第四步:重复第二步和第三步,逐个添加结点
   //这里利用一个while循环重复第二步和第三步。
   //直到用户用"Ctrl+z"结束数据输入为止 

   //将尾结点的next设置为NULL,表示这是链表的结束
   if(NULL!=tail)
       tail->next = NULL;
   else
       return -1;

   //对链表进行处理… 

   printlist(head);
   return 0;
 }

 void printlist(student* head)
 {
    //将首结点作为当前结点
    student* node = head;
    //判断当前结点是否为NULL,如果不是NULL,则输出其指向的结构体数据
    while(NULL!=node)
    {
       //利用当前结点结构体数据的指针访问其数据成员
       printf("name: %s,score: %.2f\n",node->name,node->score);
       //将结点所指向的下一个结点作为当前结点
       node = node->next;
    }
 }
#include <stdio.h>
#include <stdlib.h>

struct grade {
    int score;
    struct grade *next;
};
typedef struct grade NODE;  //typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。
//使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,
//另一个是简化一些比较复杂的类型声明。
struct grade *create();   //创建链表
void insert(NODE *head,NODE *pnew,int i);   //插入链表
void pdelete(NODE *head,int i);   //删除列表
void display(NODE *head);   //输出链表
void Pfree(NODE *head);    //销毁链表

int main(int argc, char *argv[]) {
    struct grade *head,*pnew;
    head=create();
    if (head==NULL)
        return 0;
    printf("输出创建的链表:");
    display(head);
    pnew=(NODE *)malloc(sizeof(NODE));
    if (pnew==NULL) {
        printf("创建失败!");
        return 0;
    }
    pnew->score=88;
    insert(head,pnew, 3);   //将新节点插入节点3的后面
    printf("插入后的链表:");
    display(head);
    pdelete(head,3);   //删除节点3
    printf("删除后的链表:");
    display(head);
    Pfree(head);
    return 0;
}

struct grade *create() {
    NODE *head,*tail,*pnew;
    int score;
    head=(NODE *)malloc(sizeof(NODE));  //创建头节点。
    if (head==NULL) { //创建失败返回
        printf("创建失败!");
        return NULL;
    }
    head->next=NULL;  //头节点指针域置NULL
    tail=head;  // 开始时尾指针指向头节点
    printf("输入学生成绩:");
    while (1) { //创建链表
        scanf("%d",&score);
        if (score<0) //成绩为负是退出循环
            break;
        pnew=(NODE *)malloc(sizeof(NODE));  //创建新节点
        if (pnew==NULL) { //创建失败返回
            printf("创建失败!");
            return NULL;
        }
        pnew->score=score;  //新节点数据域存放输入的成绩
        pnew->next=NULL;   //新节点指针域置NULL
        tail->next=pnew;  //新节点插入到表尾
        tail=pnew;   //为指针指向当前的尾节点
    }
    return head;  //返回创建链表的头指针
}
void insert(NODE *head,NODE *pnew,int i) {
    NODE *p; //当前指针
    int j;

    p=head;
    for (j=0; j<i&&p!=NULL; j++) //p指向要插入的第i个节点
        p=p->next;

    if (p==NULL) { //节点i不存在
        printf("与插入的节点不存在!");
        return;
    }

    pnew->next=p->next;   //插入节点的指针域指向第i个节点的后继节点
    p->next=pnew;    //犟第i个节点的指针域指向插入的新节点
}

void pdelete(NODE *head,int i) {
    NODE *p,*q;
    int j;
    if (i==0) //删除的是头指针,返回
        return;
    p=head;
    for (j=1; j<i&&p->next!=NULL; j++)
        p=p->next;  //将p指向要删除的第i个节点的前驱节点
    if (p->next==NULL) { //表明链表中的节点不存在
        printf("不存在!");
        return;
    }
    q=p->next;  //q指向待删除的节点
    p->next=q->next;  //删除节点i,也可写成p->next=p->next->next
    free(q);   //释放节点i的内存单元
}
void display(NODE *head) {
    NODE *p;
    for (p=head->next; p!=NULL; p=p->next)
        printf("%d ",p->score);
    printf("\n");
}
void pfree(NODE *head) {
    NODE *p,*q;

    p=head;
    while (p->next!=NULL) { //每次删除头节点的后继节点
        q=p->next;
        p->next=q->next;
        free(q);
    }
    free(head);   //最后删除头节点
}
void Pfree(NODE *head) {
    NODE *p,*q;
    p=head;
    while (p->next!=NULL) {
        q=p->next;
        p->next=q->next;
        free(q);
    }
    free(p);
}
时间: 2024-10-13 04:14:13

C语言之链表list的相关文章

C语言实现链表节点的插入

对链表进行增删改查是最基本的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除链表中的某个节点.这里我们要来实现在某个位置插入节点.示例代码上传至https://github.com/chenyufeng1991/InsertList  . 核心代码如下: Node *InsertToPosition(Node *pNode,int pos,int x){ if (pos < 0 || pos > sizeList(pNode) ) { printf("%s函数执

C 语言静态链表实现

C  语言静态链表实现 可运行源代码 staticlink.h #include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 #define MAX_SIZE 100 typedef int Status; typedef int ElementType; typedef struct StaticLinkList { ElementType da

C语言实现链表的逆序打印

我在前面几篇博客中<C语言实现链表节点的插入><C语言实现链表节点的删除><C实现头插法和尾插法来构建链表><C语言实现链表的基本操作>实现了链表的很多增删改查操作.这里我们要来实现链表的逆序打印,使用C来实现.代码上传至 https://github.com/chenyufeng1991/ReverseLinkedList . 基本算法是: (1)使用尾插法构建原链表: (2)依次遍历原链表: (3)取出遍历中的节点使用头插法建立一个新链表: (4)打印逆

(转载)C语言单链表实现19个功能完全详解

最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能.到目前我只写了一半,先传上来,大家有兴趣的可以帮忙指正,谢谢 在vs2010上面编译运行无错误. 每天都会把我写的新代码添加到这个里面.直到此链表完成. #include "stdafx.h" #include "stdio.h" #include <stdlib.h> #in

C语言之链表的使用

C语言链表初学者都说很难,今天就来为大家讲讲链表 讲链表之前不得不介绍一下结构体,在链表学习之前大家都应该已经学了结构体,都知道结构体里面能有许多变量,每个变量可以当做这个结构体的属性,例如: struct Stu{ char name[6]; int age; }; 在这里我们就定义了一个名为Stu的结构体,他有2个属性,name和age,在使用的时候我们先定义一个变量 struct Stu student; 通过 student.name 来获取 name属性的值. 这里的结构体只有2个东西

C语言用链表管理你的感情史,方便又快捷,赶快试试吧!

这年就算是完了,再过不久假期也快过完了.高考后本以为大学四年的时光会很长.谁晓得再过不久就要开始大二下学期了,假期的时间其实也不短啦.尤其是对我... 刚刚开始学习数据结构,感觉线性表的链式存储,似乎很难呐.应该写代码巩固下才好. 来吧,开始管理你的女盆友们吧!!! 结构体方便我们组合不同的数据类型,首先用结构体组合一个女生的属性,组合如下 这要说下,c语言的struct修饰无法像c++那样,将girl变成类型,所以用了typedef给struct girl 起了个别名wife. 在circie

Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdin和process.stdout的控制台输入输出.祝贺新手第一次发帖.哈哈哈. 代码如下: LinkList_node.js 1 //节点类的构造函数 2 function Node(element){ 3 this.element = element; 4 this.next = null; 5

C语言动态链表数据结构

链表的操作增删改查 typedef int DATA; struct SNode { DATA data; SNode* pNext; }; SNode* g_head=NULL;//全局变量 //从头部添加 void AddHead(DATA nNum) { SNode* p = (SNode*)malloc(sizeof(SNode));//C语言的方式 //SNode* p = new SNode;//C++ 方式 p->data = nNum; p->pNext = g_pHead;

c语言动态链表的创建

创建动态连链表就是将一个个节点连接起来 (1)动态生成节点 (2)输入节点数据 (3)将节点链在一起 例: typedef struct Data { char num[20]; char name[10]; char sex; float english; float chinese; float math; }; typedef struct Node { struct Data data;//结构体类型//结构体嵌套 struct Node* next;//结构体指针型 }node,*Pn