链表获取元素声明的方式 声明的含义 主要行为 行为代码 补充行为 行为代码 | 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,*linklist;
status getelem (linklist l,int i,int*pe)
{
int k=1;
for( k=1;k<=i-1;k++)
{
l=l->next;
}
*pe=l->data;
if(l||i<1||i>k)
return ERROR;
}
status listinsert(linklist* pl,int i,int e)
{
linklist p;
p=*pl;
//指向第i-1个节点
int k=1;
for(k=1;k<i-1;k++)
{
p=p->next;
}
//创建新节点(起始是创建指针指向空间,然后装入节点的数据)
//创建空间,建立箭头
linklist s;
s=(linklist)malloc (sizeof(node));
//箭头导入数据
s->data=e;
s->next=p->next;
p->next=s;
}
status listdelete(linklist*pl ,int i,int *pe)
{
//p指向第n-1个node
linklist p;
p=*pl;
for(int j=1;j<=i-1;j++)
{
p=p->next;
}
//q指向第n个node
linklist q;
q=p->next;
// 改n-1node的next的指向
p->next=q->next;
//返回n node 的data
*pe=q->data;
//消除n node
free (q);
q=NULL;
}
status listclear(linklist*pl)
{
// p q 指向第一个node
linklist p,q;
p=q=(*pl)->next;// 打括号
// q前进,p删除后,等于q,直到p==NULL
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
}
void test()
{
}
int main()
{
test();
system("pause");
return 0;
}