单链表、双链表、循环链表总结
2012-01-12 16:51
274 查看
1.单链表(为升序链表,value按升序排列)
2.双链表:(value升序)
#include <stdio.h> #include <malloc.h> typedef struct NODE { struct NODE *link; int value; } Node;//最好放在头文件中 Node *sll_creat(); int sll_length(Node *p); Node *sll_del(Node *head,int value); void sll_print(Node *head); Node *sll_insert(Node *head,int n); Node *sll_reverse(Node *head); int main() { Node *p; p=sll_creat(); sll_print(p); p=sll_del(p,3); sll_print(p); p=sll_insert(p,4); sll_print(p); p=sll_reverse(p); sll_print(p); return 0; } Node *sll_creat() { int data; Node *p; Node *head; Node *new; Node *temp;//用来删除没用的head head=(Node *)malloc(sizeof(Node)); p=head;//head没有改变, 改变的是p, head用来返回 printf("please input the values,end with EOF:\n"); while(scanf("%d",&data)==1) { new=(Node *)malloc(sizeof(Node)); if(new==NULL) { printf("malloc error!\n"); return NULL; } new->value=data; p->link=new; p=new; } temp=head; head=head->link;//将第一个无用节点head去除,如何free掉? p->link=NULL; free(temp);//删除没用的head,防止内存泄露 return head; } int sll_length(Node *p) { int count=0; while(p->link!=NULL) { count++; p=p->link; } count++;//由于尾节点的存在 return count; } void sll_print(Node *head) { int n; Node *p=head; n=sll_length(p); printf("there are %d records,they are:\n",n); while(p->link!=NULL) { printf("%d\n",p->value); p=p->link; } printf("%d\n",p->value); } /* *1.此函数缺点是只能删除第一个value出现的节点 *2.此函数验证了在结构体中的value跟局部变量value不冲突 */ Node *sll_del(Node *head,int value)//缺点,只能删除第一个value所在的节点 { Node *p1,*p2; p1=head; while(value!=p1->value&&p1->link!=NULL)//遍历链表,找到需要删除的节点 { p2=p1; p1=p1->link; } if(value==p1->value) { if(p1==head)//单独处理头节点 { head=p1->link; free(p1); } else { p2->link=p1->link; free(p1); } } else { if(p1->value==value)//单独处理尾节点 { p2->link=NULL; free(p1); } else printf("can't find the value:%d",value); } return head; } /* *此函数是在节点中的数字递增的前提下才起作用(即该链表要为有序链表,value按升序排列) * */ Node *sll_insert(Node *head,int n) { Node *p=head; Node *p_prev; Node *p0=(Node *)malloc(sizeof(Node)); while(n>=p->value&&p->link!=NULL) { p_prev=p; p=p->link; } if(p->value>n) { if(p==head) { p0->value=n; p0->link=head; head=p0; } else { p0->value=n; p_prev->link=p0; p0->link=p; } } else { p0->value=n; p->link=p0; p0->link=NULL; } return head; } Node *sll_reverse(Node *head) { Node *p1; Node *p2; Node *p3; p1=head;p2=p1->link; if(p1==NULL) { return head; } else if(p1->link==NULL) { head=p1->link; head->link=p1; p1->link=NULL; } else { while(p2->link) { p3=p2->link; p2->link=p1; p1=p2; p2=p3; } } p2->link=p1; head->link=NULL; head=p2; return head; }
2.双链表:(value升序)
#include <stdio.h> #include <malloc.h> typedef struct NODE { struct NODE *next; struct NODE *prev; int value; } Node;//不要忘了分号 Node *dll_creat(); void dll_print(Node *head); int dll_length(Node *head); Node *dll_del(Node *head,int value); Node *dll_insert(Node *head,int n); int main() { Node *p=dll_creat(); dll_print(p); p=dll_del(p,5); dll_print(p); p=dll_insert(p,6); dll_print(p); return 0; } Node *dll_creat() { Node *head; Node *p; Node *temp; Node *new; int value; printf("please input the values,end with eof:\n"); head=(Node *)malloc(sizeof(Node)); if(head==NULL) { printf("malloc error!!!\n"); return NULL; } p=head; while(scanf("%d",&value)==1) { new=(Node *)malloc(sizeof(Node)); if(new==NULL) { printf("malloc error!!!\n"); return NULL; } new->value=value; p->next=new; new->prev=p; p=new; } temp=head; head=head->next; head->prev=NULL; p->next=NULL; free(temp); return head; } int dll_length(Node *head) { Node *p; int length=0; p=head; while(p->next!=NULL) { p=p->next; length++; } length++; return length; } void dll_print(Node *head) { int n=dll_length(head); Node *p=head; printf("there are %d records,they are :\n",dll_length(p)); while(p->next!=NULL) { printf("%d\n",p->value); p=p->next; } printf("%d\n",p->value); } Node *dll_del(Node *head,int value) { Node *p=head; while(p->value!=value&&p->next!=NULL) { p=p->next; } if(p->next==NULL)//尾节点 { if(p->value==value) { p->prev->next=NULL; p->prev=NULL; free (p); } else printf("can't find %d\n",value); } if(p->value==value) { if(p==head)//头节点 { head=head->next; head->prev=NULL; free(p); } else//中间节点 { p->prev->next=p->prev->next->next; p->next->prev=p->next->prev->prev; free (p); } } return head; } Node *dll_insert(Node *head,int n) { Node *new; Node *p=head; while(p->value<n&&p->next!=NULL) { p=p->next; } new=(Node*)malloc(sizeof(Node)); if(new==NULL) { printf("malloc error!!!\n"); return NULL; } new->value=n; if(p->next==NULL)//尾节点 { p->next=new; new->prev=p; new->next=NULL; } else if(p==head)//头节点 { new->prev=NULL; new->next=p; p->prev=new; head=new; } else//中间节点 { p->prev->next=new; new->prev=p->prev; new->next=p; p->prev=new; } return head; }
相关文章推荐
- C语言-----链表的各项操作总结------双向循环链表
- 【学习总结】循环链表模拟约瑟夫问题和循环链表的初始化、建立、删除(按值与按位置)
- 单链表反转(三种方法总结)
- JAVA----关于数组模拟链表的练习总结
- 链表各种操作总结(个人笔记)
- 基本数据结构学习总结:单向链表
- 数据结构-链表 总结
- 对链表学习的总结
- 链表查找问题总结
- 链表的应用:利用无头结点循环链表解决约瑟夫环问题
- 剑指Offer学习总结-反转链表
- 面试中的链表问题总结
- 数据结构与算法分析笔记与总结(java实现)--链表2:倒数第k个结点问题(k从1开始)
- (转)面试大总结之一:Java搞定面试中的链表题目
- 这道题目是链表倒转的重要总结
- 关于合并有序数组/链表的总结
- 关于链表操作编程实现的一些总结
- 《数据结构》 循环链表和双向链表常用操作代码集合
- 数据结构——链表(单链表、循环链表、双向链表、静态链表)
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)