前言
提示:这里可以添加本文要记录的大概内容:
链表是一种常见且十分重要的数据结构,按存储结构来说,它是区别于顺序存储(如数组)的一类逻辑关系与物理存储分离的数据结构。它是由一系列“结点”构成的,每个结点上又包含了元素的数据域和指针域(包含下一个结点的地址),这样就可以克服顺序存储机械的特点,可以动态的添加新的数据成员,但是它也有一些缺点,对于数据的访问特别依赖于头指针,需要像寻宝一样,不断获取线索向前推进。链表使用十分广泛,后续的线性表,树,图等等都有链式结构,本文主要介绍静态链表、动态链表的建立、插入、删除操作,后续会进行一些补充。
提示:以下是本篇文章正文内容,下面案例可供参考
一、链表
示例:
//第一个小小链表建立,加强理解链表的思路。
#include<stdio.h>
struct Student//建立结构体成员
{int num;
float score;
struct Student *next;//指向结构体的数组,它是链表中的关键钥匙
};
int main()
{struct Student a,b,c,*head,*p;
a.num=10101;a.score=89.5;
b.num=10103;b.score=90;
c.num=10107;c.score=88;
head=&a;//头指针指向第一个元素
a.next=&b;
b.next=&c;
c.next=NULL;//将尾指针设置为空,作为结束标志。
p=head;
do
{printf("%ld %5.f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
return 0;
}
#include<stdio.h>
#include<stlib.h>
#define LEN sizeof(struct Student)
//构造链表函数
struct Student*creat(){
struct Student*head,*p1,*p2;
int n=0;
p1=p2=(struct Student*)malloc(LEN);//动态分配内存
scanf("%ld,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0){
n=n+1;
if(p1->num==1)
head=p1;头指针开始
else p2->next=p1;
p2=p1;//将p2指向p1,并且把p1赋值给p2,方便再一次使用p1读入数据
p1=(struct Stuent*)malloc(LEN);
scanf("%ld,%f",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);//结束之后一定要返回首地址(头指针)
}
//输出链表值函数
void print(struct Student head){
struct Student*p;
p=head;
if(head!=NULL)
do
{printf("%ld,%f",p->num,p->score);
p=p->next;}
while(p!=NULL);
}
//链表插入操作,将数据元素e插入到第i个元素的位置
ListInsert_L(Linklist &L,int i,(lei xing)e){
p=L;
j=0;
while(!p&&j<i-1){
p=p->next;++j;
}
s=new Lnode;//生成新的空间(c++)
s->data=e;s->next=p->next;
p->next=s;}//p在i-1的位置,原始指向第i的位置,现在使s指向原来的i上,再把s赋值给P的指针域
//链表删除第i个数操作
ListDelete_L(Linklist &L,int i){
p=L;j=0;
while(!p->next&&j<i-1){
p=p->next;++j;
}
q=new Lode;
q=p->next;
p->next=q->next;
delete q;//同free函数一样}
}
注:以上为部分代码,若想上机运行,则还需要一些前置的申明定义,具体证明省略......
共勉之