数据结构笔记二(20120819)

来源:互联网 发布:云平台软件 编辑:程序博客网 时间:2024/04/27 20:35

数据结构笔记二(20120819)

 

 

 

 

 

/* * * wuxiuwen * 20120821  * 双向链表的创建,删除节点,插入节点,链表排序,节点的倒序输出, *  */#include<stdio.h>#include<stdlib.h>typedef struct node{int data;struct node *next;struct node *front;}DNode;void creatlist(DNode **);void outputlist(DNode *);void freelist(DNode **);DNode *Getnode(int);DNode *insertlist_node(DNode *,DNode *);DNode *rm_listnode(DNode *,DNode *);DNode *sort_listnode(DNode *);DNode *reverse_list(DNode *);int main(){DNode *head =NULL;DNode *pnew=NULL;creatlist(&head);printf("创建的节点是:\n");outputlist(head);printf("排序结果如下:\n");head = sort_listnode(head);outputlist(head);pnew = Getnode(5);printf("插入data为%d到有序序列为:\n",5);head = insertlist_node(head,pnew);outputlist(head);printf("删除增加的节点:\n");head = rm_listnode(head,pnew);outputlist(head);/*head = reverse_list(head);printf("倒序输出链表为:\n");outputlist(head);*/freelist(&head);return 0;}DNode *reverse_list(DNode *head){DNode *headnew =NULL;DNode *p1 = NULL;DNode *p2 = NULL;DNode *p3 = NULL;headnew = (DNode *)malloc(sizeof(DNode));headnew->next =headnew->front =NULL;p2 = headnew;head = head ->next;if(head ==NULL){return head;}while(head !=NULL){p1 = head ;head = head ->next;}headnew = headnew->next;while(p1 != NULL){p3 = p1;p3 ->next = NULL;p3 ->front = NULL;p1 = p1->front;p2->front = headnew;p2->next = NULL;headnew->next=p2; }return p2;}DNode *sort_listnode(DNode *head){DNode *p1=NULL;DNode *p2=NULL;DNode *headnew = NULL;headnew = (DNode *)malloc(sizeof(DNode));headnew->next =headnew->front =NULL;p2 = headnew;head = head ->next;while(head !=NULL){p1 = head;head = head ->next;p1 ->next = NULL;headnew = insertlist_node(headnew,p1);} return p2;}DNode *rm_listnode(DNode *head,DNode *pdel){//查询链表中有这个节点pdel,有的话删除掉DNode *p = head;if(head ==NULL && head ->next ==NULL){return head;}while(p !=NULL && p!=pdel){p=p->next;}if(p  ==NULL && p !=pdel){printf("no!");return head;}if(p == pdel && p ->next==NULL){p->front->next =NULL;}if(p == pdel && p->next!=NULL){p->front->next=p->next;p->next->front=p->front;}free(pdel);return head;}DNode *insertlist_node(DNode *head,DNode *pnew)     //插入的队列是从小到大的有序序列{DNode *p1=head;DNode *p2=NULL;head = head ->next;if(head  ==NULL){pnew ->front = p1;pnew ->next = NULL;p1->next=pnew;return p1;}while(head != NULL){if(head->data < pnew->data){p2 =head;head = head->next;}else break;}if(head==NULL){pnew->front=p2;pnew->next = NULL;p2->next = pnew;}if(head != NULL && head->data >= pnew->data){pnew->front = p2;                pnew->next = head;                p2->next = pnew;                head->front=pnew;}return p1;}DNode *Getnode(int num){DNode *p=(DNode *)malloc(sizeof(DNode));p->data = num;p->next =NULL;return p;}void creatlist(DNode **phead){DNode *pnew=NULL;int num;DNode *pend =NULL;DNode **head;*phead = (DNode *)malloc(sizeof(DNode));(*phead)->next =(*phead)->front =NULL;head = &((*phead)->next);scanf("%d",&num);while(num !=0){pnew = Getnode(num);if(*head ==NULL){*head = pend = pnew;pnew->front = *phead;}else{pend->next = pnew;pnew->front = pend;pend = pnew;}scanf("%d",&num);} }void outputlist(DNode *head){DNode *p = NULL;head  = head ->next;while(head !=NULL){printf("%d ",head->data);p = head;head = head ->next;}/*printf("\n*******逆向输出******\n");while(p->front !=NULL){printf("%d ",p->data);p = p->front;}*/printf("\n");}void freelist(DNode **head){DNode *pdel =NULL;printf("\n释放空间的链表为:\n");while(*head !=NULL){pdel = *head;*head = (*head)->next;printf("%d ",pdel ->data);free(pdel);}printf("\n");}


*********************************************************************************************************

程序运行结果:

 

[root@localhost wuxiuwen]# ./a.out
2 6 9 0
创建的节点是:
2 6 9
排序结果如下:
2 6 9
插入data为5到有序序列为:
2 5 6 9
删除增加的节点:
2 6 9

释放空间的链表为:
0 2 6 9
[root@localhost wuxiuwen]#

 ****************************************************************************************************************