#include <stdio.h>
#include <stdlib.h>
#define elemtype int
typedef struct lnode *list;
struct lnode{
elemtype data;//数据部分
list next;//下个节点指针
};
struct lnode l;
list ptrl;
list makeempty(list ptrl)//创建空表
{
ptrl=(list)malloc(sizeof(struct lnode));
ptrl->next=NULL;
return ptrl;
}
int length(list ptrl)//求表长,头节点不算在内
{
list p=ptrl;
int i;
while(p->next){//p的指针不为null则 节点数加一
p=p->next;
i++;
}
return i;
}
list findkth(int k,list ptrl)//查找第k个节点
{
list p=ptrl;
while(p&&k){//结束循环:1 找到第k个节点
// 2 p的值为null
k--;
p=p->next;
}
if(p==NULL){
printf("illegal Kth\n");
}
return p;
}
list find(elemtype x,list ptrl)//按值查找,返回第一次出现的位置指针
{
list p=ptrl;
while(p&&p->data!=x){//结束循环:1 没找到,链表已经结束p=null
//2 找到p的data等于x
p=p->next;
}
return p;
}
list insert(elemtype x,int i,list ptrl)//插入
{
list p=ptrl;
list s=(list)malloc(sizeof(struct lnode));//申请一个节点s空间
while(p){
list q=p;
p=p->next;
i--;
if(i==0){
s->next=p;
q->next=s;//once errored! p现在只是as一个值null,不指向任何节点
s->data=x; //解决方案:记录q为null的前一个指针为q,q->next为目标
return ptrl;
}
}
printf("illegal insertion!\n");
return ptrl;
}
list delet(int i,list ptrl)//删除第i个节点
{
list p=findkth(i-1,ptrl);//找到第i-1个节点的指针
p->next=p->next->next ;
free(p->next);//释放第i个节点
return ptrl;
}
//主函数验证如下:
//终于成功了,开森!
int main()
{
list l=makeempty(l);
insert(1,1,l);
insert(2,2,l);
insert(3,3,l);
insert(4,4,l);
printf("%d\n",length(l));
list p=findkth(5,l);//ps:头节点为第0个节点
//printf("%d\n",p->data);
p=find(4,l);
printf("%d\n",p->data);
delet(4,l);//删除第四个节点
printf("%d\n",length(l));
return 0;
}
#include <stdlib.h>
#define elemtype int
typedef struct lnode *list;
struct lnode{
elemtype data;//数据部分
list next;//下个节点指针
};
struct lnode l;
list ptrl;
list makeempty(list ptrl)//创建空表
{
ptrl=(list)malloc(sizeof(struct lnode));
ptrl->next=NULL;
return ptrl;
}
int length(list ptrl)//求表长,头节点不算在内
{
list p=ptrl;
int i;
while(p->next){//p的指针不为null则 节点数加一
p=p->next;
i++;
}
return i;
}
list findkth(int k,list ptrl)//查找第k个节点
{
list p=ptrl;
while(p&&k){//结束循环:1 找到第k个节点
// 2 p的值为null
k--;
p=p->next;
}
if(p==NULL){
printf("illegal Kth\n");
}
return p;
}
list find(elemtype x,list ptrl)//按值查找,返回第一次出现的位置指针
{
list p=ptrl;
while(p&&p->data!=x){//结束循环:1 没找到,链表已经结束p=null
//2 找到p的data等于x
p=p->next;
}
return p;
}
list insert(elemtype x,int i,list ptrl)//插入
{
list p=ptrl;
list s=(list)malloc(sizeof(struct lnode));//申请一个节点s空间
while(p){
list q=p;
p=p->next;
i--;
if(i==0){
s->next=p;
q->next=s;//once errored! p现在只是as一个值null,不指向任何节点
s->data=x; //解决方案:记录q为null的前一个指针为q,q->next为目标
return ptrl;
}
}
printf("illegal insertion!\n");
return ptrl;
}
list delet(int i,list ptrl)//删除第i个节点
{
list p=findkth(i-1,ptrl);//找到第i-1个节点的指针
p->next=p->next->next ;
free(p->next);//释放第i个节点
return ptrl;
}
//主函数验证如下:
//终于成功了,开森!
int main()
{
list l=makeempty(l);
insert(1,1,l);
insert(2,2,l);
insert(3,3,l);
insert(4,4,l);
printf("%d\n",length(l));
list p=findkth(5,l);//ps:头节点为第0个节点
//printf("%d\n",p->data);
p=find(4,l);
printf("%d\n",p->data);
delet(4,l);//删除第四个节点
printf("%d\n",length(l));
return 0;
}