链表获取元素声明的方式 声明的含义 主要行为 行为代码 补充行为 行为代码 | status getelem(linklist l,int i,int *e) 从头指针 l 开始数到第i个node,用*e保存它的data 创建linklist赋值头指针指向第一个元素,循环赋值指针直到到达第i个元素,用*e储存data linklist p; p=l(->next); //括号后少走一次,于是给下面加上等于好,多循环一次 int j =1; while(j<=i) { p=p->next; j++; } *e=p->data;
链表为空 i越界
if(!p||j>i) return ERROR;
|
链表插入元素补充 图解 声明方式 为什么是*l 主要行为 代码行为 | status listinsert (linklist*l,int i,int e) 指向头指针的指针,方便地址传递, 创建新指针p,指针赋值了头指针,循环赋值指针到达第i-1个元素 创建新node,首地址即为node*赋值新指针s,值赋值e s指向第i个node i-1node的next指向s linklist p; //指向第i-1个节点 p=(*l); int j=1; while(j<i) { p=p->next; j++; } //创建新节点 linklist s; s=(linklist)malloc(sizeof(node)); s->data=e; //改变指向 //这里是指针(地址)赋值!!! s->next=p->next; p->next=s; |
链表删除元素声明方式 主要行为 代码实现 |
status listdelete(linklist*l,int i,int*e)
创立指针p,赋值头指针,循环赋值指针直到指向第i-1个node
创建指针q,指向第i个node
通过pq,使第i-1个node的next指向第n+1个node
返回第i个node的data
删掉第i个node
linklist p; p=*l; int j=1; while(j<i) { p=p->next; }
linklist q; q=p->next;
p->next=q->next;
*e=q->data;
free (q); q=NULL;
|
随机传入数字头插创建头节点声明方式 声明含义 主要行为 行为代码 | status creatlisthead(linklist*l ,int n) 盒子指向指向头节点的盒子,n个数 分配空间,创建头节点指针 头节点next指向NULL,无data 循环: 创建新节点指针 其data为随机值 其next赋值头节点next 头节点赋值新节点指针 *l=(linklist)malloc(sizeof(node)); (*l)->next=NULL;
for(int i=0;i<n;i++) { linklist p=(linklist)malloc(sizeof(node)); p->data=rand()&100+1; p->next=(*l)->next; (*l)->next=p;
} |
链表转化为空连表声明 声明参数的含义 主要行为 行为代码 | status clearlist(linklist*l)
盒子1写着l,伸出箭头指向盒子2,盒子2伸出箭头指向头节点
p指向第一个节点,q指向第二个节点,第一个节点释放,循环执行直到p指向空 linklist p,q; p=(*l)->next; *l=NULL; while(p) { q=p->next; free(p); p=q; } |
代码整合:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include <string.h>
//-----------------------------
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int status;
#define MAXSIZE 20
//-----------------------------
typedef struct node
{
int data;
node*next;
}node;
typedef node* linklist;
status getelem(linklist l,int i,int *e)
{
linklist p;
p=l->next;
int j =1;
while(j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
*e=p->data;
}
status listinsert (linklist*l,int i,int e)
{
linklist p;
//指向第i-1个节点
p=(*l);
int j=1;
while(j<i)
{
p=p->next;
j++;
}
//创建新节点
linklist s;
s=(linklist)malloc(sizeof(node));
s->data=e;
//改变指向
//这里是指针(地址)赋值!!!
s->next=p->next;
p->next=s;
}
status listdelete(linklist*l,int i,int*e)
{
linklist p;
p=*l;
int j=1;
while(j<i)
{
p=p->next;
}
linklist q;
q=p->next;
p->next=q->next;
*e=q->data;
free (q);
q=NULL;
}
status creatlisthead(linklist*l ,int n)
{
*l=(linklist)malloc(sizeof(node));
(*l)->next=NULL;
for(int i=0;i<n;i++)
{
linklist p=(linklist)malloc(sizeof(node));
p->data=rand()&100+1;
p->next=(*l)->next;
(*l)->next=p;
}
}
status clearlist(linklist*l)
{
linklist p,q;
p=(*l)->next;
*l=NULL;
while(p)
{
q=p->next;
free(p);
p=q;
}
}
void test()
{
}
int main()
{
test();
system("pause");
return 0;
}