实现思想 :通过指针把要元素串起来
简单结构图
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 <stdio.h> #include <windows.h> 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;i<len;i++) { //赋值过程 printf("录入第 %d 个元素",i+1); Node* pNew = (Node*)malloc(sizeof(Node)); printf("输入学生姓名:"); scanf("%s",&(pNew->Element.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;i<Index;i++) { if(NULL == pTmp->next) { 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;i<Index;i++) { if(NULL == pTmp->next) { 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;i<Index-1;i++) { if(NULL == pTmp->next) { 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; }
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论