双链表
#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct node
{
ElementType data;
struct node *prev;//注意双链表结构体要加这个
struct node *next;
}Node;
Node *CreateList(void)
{
Node *head,*tail,*p;
head = tail = p = NULL;
ElementType x;
while(1)
{
scanf("%d",&x);
if(x == 0)
break;
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = p->prev = NULL;
if(head == NULL)
{
head = tail = p;
}
else
{
Node *r = head;//双链表不再需要定义pre了
while(r)
{
if(r->data > x)
break;
r = r->next;
}
if(r == NULL)
{
tail->next = p;
p->prev = tail;
tail = p;
}
else if(r == head)
{
p->next = head;
head->prev = p;
head = p;
}
else
{
p->next = r;
r->prev->next = p;
p->prev = r->prev;
r->prev = p;//很重要的一点,这个顺序不能随意改变,r->prev = p;这句一定要放在最后,因为r->prev这根线要指向r前面那个对象,如果之前执行了r->prev = p这句,那么线就会断掉,后面的语句就会发生错误,所以要放最后面;
}
}
}
return head;
}
Node *find_last(Node *list)
{
while(list && list->next != NULL)
list = list->next;
return list;
}
/*这个函数在解决链表里面全部都是一样的数据且要删除时存在问题,思路有两种,创建时添加一个空节点,或者在循环中剩下最后一个节点,单独去处理*/
Node *delete_num(Node *list,ElementType num)
{
Node *r = list;
Node *tail = find_last(list);
while(r)
{
if(r->data == num)
{
if(r == list)
{
list = list->next;
list->prev = r->next = NULL;
free(r);
r = list;
}
else if(r == tail)
{
tail = tail->prev;
tail->next = r->prev = NULL;
free(r);
r = NULL;
}
else
{
Node *p = r->next;
r->prev->next = r->next;
r->next->prev = r->prev;
r->next = r->prev = NULL;
free(r);
r = p;//删除的时候要注意没有pre了
,只能用r->prev代替;
}
}
else
{
r = r->next;
}
}
return list;
}
void PrintList(Node *list)
{
while(list)
{
printf("%d\t",list->data);
list = list->next;
}
printf("\n");
}//打印和单链表一样;
int main(int argc,char *argv[])
{
Node *list = CreateList();
PrintList(list);
ElementType x;
scanf("%d",&x);
list = delete_num(list,x);
PrintList(list);
return 0;
}
自己做的考虑了1111情况;
#include<stdio.h>
#include<stdlib.h>
typedef struct stu
{
int data;
struct stu *next;
struct stu *prev;
}node;
node *chuangjain()
{
node *head,*tail,*p;
head=tail=p=NULL;
int x;
while(1)
{
scanf("%d",&x);
if(x==0)
break;
p=(node*)malloc(sizeof(node));
p->data=x;
p->next=NULL;
p->prev=NULL;
if(head==NULL)
{
head=tail=p;
}
else
{
node *r=head;
while(r)
{
if(x<r->data)
break;
else
{
r=r->next;
}
}
if(r==head)
{
p->next=head;
head->prev=p;
head=p;
}
else if(r==NULL)
{
tail->next=p;
p->prev=tail;
tail=p;
}
else
{
p->next=r;
r->prev->next=p;
p->prev=r->prev;
r->prev=p;
}
}
}
return head;
}
void print(node *A)//头打印到尾,尾打印到头;
{
node *findlast(node *A);
node *head=A;
printf("正相序列\n");
while(A)
{
printf("%d\t",A->data);
A=A->next;
}
printf("\n");
printf("反向序列\n");
node *list=findlast(head);
while(list)
{
printf("%d\t",list->data);
list=list->prev;
}
printf("\n");
}
node *findlast(node *A)
{
if(A!=NULL)
{
while(A&&A->next)
A=A->next;
}
return A;
}
node *deletall(node *A,int x)
{
node *r=A;
node *tail=findlast(A);
while(r)
{
if(r->data==x)
{
if(r==A)
{
while(A->data==x&&A->next)
{
A=A->next;
A->prev=r->next=NULL;
free(r);
r=A;
}
if(A->data==x)
{
A->next=A->prev=NULL;
free(A);
A=NULL;
return NULL;
}
}
/*if(r=A)
{
A=A->next;
A->prev=r->next=NULL;
free(r);
r=A;
}*/
else if(r==tail)
{
tail=tail->prev;
tail->next=r->prev=NULL;
free(r);
r=NULL;
}
else
{
node *p=r->next;
r->prev->next=r->next;
r->next->prev=r->prev;
r->next=r->prev=NULL;
free(r);
r=p;
}
}
else
{
r=r->next;
}
}
return A;
}
int main ()
{
node *A=chuangjain();
int x;
scanf("%d",&x);
print(deletall(A,x));
return 0;
}