不要求逻辑上相邻的元素物理上也相邻,通过“链”建立其逻辑关系
插入,删除元素只需要修改“链”。
数据对象集:
n个结点(每个结点包括两部分:该节点存储的数据,指向下一结点的指针)
操作集:
插入,删除,尾部插入,打印,返回表长,查找元素(按序号,按元素)
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode* List;
struct LNode{
int data;
List next;
};
//返回表长
int Length(List Ptr){
int len=0;
List temp=Ptr;
while(temp!=NULL){
len++;
temp=temp->next;
}
return len;
}
//查找(按序号)
List Find(int K,List Ptr){
List temp=Ptr;
int i=1;
while(temp!=NULL&&i<K){
temp=temp->next;
i++;
}
if(i==K)return temp;//找到,返回对应指针
else return NULL;//没找到,返回NULL
}
//查找(按元素)
List Find_2(int x,List Ptr){
List temp=Ptr;
while(temp!=NULL&&temp->data!=x){
temp=temp->next;
}
return temp;//找到则返回对应指针,未找到则返回NULL
}
//插入
List Insert(int x,int i,List Ptr){
List pre,now;//pre表示第i-1个结点,now表示要插入的新结点。
//如果要在表头插入
if(i==1){
now=(List)malloc(sizeof(struct LNode));
now->data=x;
now->next=Ptr;
return now;
}
//查找第i-1个结点
pre=Find(i-1,Ptr);
if(pre==NULL){
return NULL;
}//未找到,无法插入
else{
now=(List)malloc(sizeof(struct LNode));
now->data=x;
now->next=pre->next;
pre->next=now;
return Ptr;
}
}
//删除
List Delete(int i,List Ptr){
List pre,now;
//要删除头结点
if(i==1){
now=Ptr;
if(Ptr!=NULL){
Ptr=Ptr->next;
}else{
return NULL;
}
free(now);//释放原头结点空间
return Ptr;//返回新头结点
}
pre=Find(i-1,Ptr);
if(pre==NULL){
return NULL;//查找不到第i-1个结点,返回NULL
} else if(pre->next==NULL){
return NULL;//元素i-1后无结点,即第i个结点不存在,返回NULL
}else{
now=pre->next;
pre->next=now->next;
free(now);
return Ptr;
}
}
void Print(List Ptr){
List temp=Ptr->next;
while(temp!=NULL){
printf("%d ",temp->data);
temp=temp->next;
}
}
//创建一个结点
List Creat_Node(int x){
List n=(List)malloc(sizeof(struct LNode));
n->data=x;
n->next=NULL;
return n;
}
//尾部插入
void insert_tail(List Ptr,int x)
{
List n=Creat_Node(x);
List temp=Ptr;
while(NULL!=temp->next){
temp=temp->next;
}
temp->next=n;
}
附上逻辑图帮助理解插入和删除:
插入:
删除: