数据结构之双链表

双链表

#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;

}

猜你喜欢

转载自blog.csdn.net/weixin_41723504/article/details/79927142