請看代碼:
#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;
}