链表
实现思想 :通过指针把要元素串起来
简单结构图
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;
}