实现思想 :通过指针把要元素串起来

简单结构图

struct Student
{
    char name[10];
    int score;
}
struct Node
{
    Student Element;
    Node* next;
}

每一个节点包含此节点信息和下一个节点的指针

有点:插入删除方便
缺点:查找麻烦

基本元素实现

//方法/函数
int InitList();//初始化链表
int IsEmpty(); //判断链表是否为空 空返回1 非空0
void Clear(Node* p);   //清空链表
ini Find(int Index,Student* element); //根据索引获取元素
int Insert(int Index,Student* Element);//根据索引新增元素
int Delete(int Index,Student* Element);//根据索引删除元素
int GetSize();//获取链表中元素的数量
//属性/变量
Node* m_pHead;  //链表头指针,指向第一个节点
Node* m_pEnd;   //链表尾指针,指向最后一个节点
int m_dwLength;    //元素的数量

链表简单实现

// _20180125.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
struct Student
{
    char name[10];
    int id;
    int achievement;
};
struct Node
{
    Student Element;
    Node* next;
};
//初始化链表
Node* InitList()
{
    int len;
    printf("输入链表长度 \n");
    scanf("%d",&len);
    Node* pHead = (Node*)malloc(sizeof(Node));
    pHead->next=NULL;
    Node* pEnd = pHead ;//pEnd 永远指向尾节点的指针
    for (int i =0;iElement.name));
        printf("\n输入学生id:");
        scanf("%d",&(pNew->Element.id));
        printf("\n输入学生成绩");
        scanf("%d",&(pNew->Element.achievement));
        pNew->next=NULL;
        pEnd->next=pNew;//从把之前的最后一个元素的next指向刚才新建的元素
        pEnd=pNew;//重新把pEnd赋值为最后一个元素
    }
    return pHead;
}
//判断链表是否为空 空返回1 非空0
int IsEmpty(Node* pHead)
{
    if(NULL==pHead->next)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
 //清空链表
void Clear(Node* pHead)
{
    if(NULL!=pHead->next){
        Clear(pHead->next);
    }
    free(pHead);
}
//根据索引获取元素
Student* Find(Node* pHead,int Index)
{
    Node* pTmp=pHead->next;
    for (int i=0;inext)
        {
            printf("插入位置不合法\n");
            return NULL;
        }
        pTmp=pTmp->next;
    }
    return &(pTmp->Element);
}
//根据索引新增元素
int Insert(Node* pHead,int Index,Student* Element)
{
    Node* pTmp = pHead->next;
    Node* pNext;
    for (int i=0;inext)
        {
            printf("插入位置不合法\n");
            return 0;
        }
        pTmp=pTmp->next;
    }
    pNext = pTmp->next;
    //插入新元素
    Node* pNew = (Node*)malloc(sizeof(Node));
    strcpy(pNew->Element.name,Element->name);
    pNew->Element.id=Element->id;
    pNew->Element.achievement=Element->achievement;
    pNew->next=pNext;
    pTmp->next=pNew;
    return 1;
}
//根据索引删除元素
int Delete(Node* pHead,int Index,Student* Element)
{
    Node* pTmp = pHead->next;
    Node* pDel;
    for (int i =0;inext)
        {
            printf("删除位置不合法\n");
            return 0;
        }
        pTmp=pTmp->next;
    }
    //此时 pTmp是上一个节点
    pDel = pTmp->next; //这里是要删除的节点
    pTmp->next=pDel->next;
    free(pDel);
    return 1;
}
//获取链表中元素的数量
int GetSize(Node* pHead)
{
    int num =0;
    Node* pTmp = pHead->next;
    while (pTmp!=NULL)
    {
        num++;
        pTmp=pTmp->next;
    }
    return num;
}
int main(int argc, char* argv[])
{
    Node* pHead= InitList();
    Student* s ;
    if(IsEmpty(pHead))
    {
        printf("链表为空");
    }
    int length = GetSize(pHead);
    printf("链表长度 %d",length);
    s =Find(pHead,1);
    Insert(pHead,2,s);
    Clear(pHead);
    s=NULL;
    pHead=NULL;
    return 0;
}