不要求逻辑上相邻的元素物理上也相邻,通过“链”建立其逻辑关系
插入,删除元素只需要修改“链”。
数据对象集:
n个结点(每个结点包括两部分:该节点存储的数据,指向下一结点的指针)
操作集:
插入,删除,尾部插入,打印,返回表长,查找元素(按序号,按元素)
- #include
- #include
- 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
- 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;
- }
附上逻辑图帮助理解插入和删除:
插入:
删除: