【數據結構】線性表的鏈式存儲結構—刪除單鏈表L中值爲x的結點的直接前驅結點

請看代碼:

#include<stdio.h>
#include<stdlib.h>
struct Lnode
{
    int data;
    Lnode *next;
};
int Init(struct Lnode *L, int i)
{
    struct Lnode *p;
    struct Lnode *q=L;
    int j=0;
    while(j<i)
    {
        p = (struct Lnode *)malloc(sizeof(struct Lnode));
        scanf("%d",&((*p).data));
        (*p).next =NULL;
        (*q).next = p;
        q= p;
        j++;
    }
    return 0;
}
int del_prior(struct Lnode *L,int x)
{
    if((*L).next==NULL)//判斷是否是空表
    {
        printf("空鏈表");
        return 0;
    }
    struct Lnode *q;
    struct Lnode *p;
    struct Lnode *k;
    k=L;
    q= (*k).next;
    if((*q).data==x&&(*q).next==NULL)//判斷第一個是否是x,如果是則沒有直接前驅
    {
        printf("直接前驅是頭結點!");
        return 0;
   } 
   if((*q).next==NULL)//若只有一個元素且不是x,則退出
   {
       printf("表中不存在x結點!");
       return 0;
   }
    p= (*q).next;
    int r= 0;
    while(1)
    {
        if((*p).data==x)
        {
                free(q);
                (*k).next = p;
                r= 1;
                if((*p).next!=NULL)
                {
                    q= p;
                    p = (*p).next;
                    
                }else{
                    printf("刪除成功!");
                    return 0;
                }
        }
        else
        {
            if((*p).next!=NULL)
            { 
              p = (*p).next;
              q = (*q).next;
              k = (*k).next;
             }
            else
            {
                if(r==1)
                    printf("刪除成功!");
                else
                    printf("表中不存在有直接前驅的x結點!");
                return 0;
            }
        }    
    }
    return 0;
}
int main()
{
    struct Lnode Head;
    struct Lnode *L=&Head;
    (*L).next = NULL;
    int i = 3;
    Init(L,i);
    del_prior(L,3);
    printf("\n執行結束\n");
    L=(*L).next;
    printf("執行後的鏈表如下:\n");
    while(L!=NULL)
    {
        printf("%d\n",(*L).data);
        L = (*L).next;
    }
    return 0;
}

第二種寫法

#include<stdio.h>
#include<stdlib.h>
struct Lnode
{
    int data;
    Lnode *next;
};
int Init(struct Lnode *L, int i)
{
    struct Lnode *p;
    struct Lnode *q=L;
    int j=0;
    while(j<i)
    {
        p = (struct Lnode *)malloc(sizeof(struct Lnode));
        scanf("%d",&((*p).data));
        (*p).next =NULL;
        (*q).next = p;
        q= p;
        j++;
    }
    return 0;
}
int del_prior(struct Lnode *L,int x)
{
    if(L->next==NULL)//判斷是否是空表
    {
        printf("空鏈表");
        return 0;
    }
    struct Lnode *q;
    struct Lnode *p;
	p = L->next;
   while(p->next)
   {
	   if((p->next)->data==x)
	   {
		   L->next = p->next;
		   free(p);
		   p = L->next;
	   }
	   else  break;
   }
   while(p->next!=NULL&&((p->next)->next)!=NULL)
   {
	   if(((p->next)->next)->data == x)
	   {
		   q = p->next;
		   p->next = (p->next)->next;
		   free(q);
	   }
	   else p = p->next;
   }
   return 1;
}
int main()
{
    struct Lnode Head;
    struct Lnode *L=&Head;
    (*L).next = NULL;
    int i = 5;
    Init(L,i);
    del_prior(L,3);
    printf("\n執行結束\n");
    L=(*L).next;
    printf("執行後的鏈表如下:\n");
    while(L!=NULL)
    {
        printf("%d\t",(*L).data);
        L = (*L).next;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章