数据结构之单链表、双链表的基本操作
2013-04-29 13:32
781 查看
单链表双链表中经常纠结的概念:
1、链表是否有含有头结点:
(1)带头结点的链表头指针head指向头结点,数据域不含任何信息,只是指向链表的第一个保存信息的结点,head->next等于null则表示链表为空;
(2)不带头结点的链表头指针head直接指向保存信息的第一个结点,head==null,表示链表为空。
说道这里,有人会对头指针,头结点的概念迷糊了。。。
头指针:指向链表的第一个结点,不管是不是带头结点的;
头结点:只针对带头结点的链表而言,只作为链表存在的标志,不含信息。
一般建立链表最好用带头结点的。
未完待续。。。
1、链表是否有含有头结点:
(1)带头结点的链表头指针head指向头结点,数据域不含任何信息,只是指向链表的第一个保存信息的结点,head->next等于null则表示链表为空;
(2)不带头结点的链表头指针head直接指向保存信息的第一个结点,head==null,表示链表为空。
说道这里,有人会对头指针,头结点的概念迷糊了。。。
头指针:指向链表的第一个结点,不管是不是带头结点的;
头结点:只针对带头结点的链表而言,只作为链表存在的标志,不含信息。
一般建立链表最好用带头结点的。
#include <stdio.h> #include <stdlib.h> typedef struct Lnode//单链表结点 { int data; struct Lnode *next; }Lnode; typedef struct Dnode//双链表结点 { int data; struct Dnode *next,*prior; }Dnode; int main() { void CreateListByTail(Lnode *c,int a[],int length);//尾插法建立单链表 void CreateListByHead(Lnode *c,int a[],int length);//头插法建立单链表 void CreateDListByTail(Dnode *c,int a[],int length);//尾插法建立双链表 void CreateDListByHead(Dnode *c,int a[],int length);//头插法建立双链表 void MergeTwoList(Lnode *A,Lnode *B);//合并两个按顺序排列的单链表,不创建新结点 int SearchAndDeleteList(Lnode *list,int x);//单链表查找与x相等的第一个元素并删除 int SearchAndDeleteDList(Dnode *list,int x);//双链表查找与x相等的第一个元素并删除 void PrintList(Lnode *list);//输出单链表数据 void PrintDList(Dnode *dlist);//输出双链表数据 Lnode *list; Lnode *listA; Dnode *dlist; list=(Lnode*)malloc(sizeof(Lnode)); listA=(Lnode*)malloc(sizeof(Lnode)); dlist=(Dnode*)malloc(sizeof(Dnode)); list->next=NULL; listA->next=NULL; dlist->next=NULL; int a[5]={1,2,6,8,12}; int b[4]={3,7,9,10}; CreateListByTail(list,a,5); //CreateDListByHead(dlist,a,5); PrintList(list); //PrintDList(dlist); CreateListByTail(listA,b,4); PrintList(listA); printf("after list&dlist merged:\n"); MergeTwoList(list,listA); PrintList(list); //SearchAndDeleteList(list,4); //SearchAndDeleteDList(dlist,4); //PrintList(list); //PrintDList(dlist); return 0; } void CreateListByHead(Lnode *c,int a[],int length) { Lnode *p; int i=0; for(i=0;i<length;i++) { p=(Lnode*)malloc(sizeof(Lnode)); p->data=a[i]; p->next=c->next; c->next=p; } } void CreateListByTail(Lnode *c,int a[],int length) { int i=0; Lnode *n,*p;//n是每次新的结点,p是前一个结点 p=c; for(i=0;i<length;i++) { n=(Lnode*)malloc(sizeof(Lnode)); n->data=a[i]; n->next=p->next; p->next=n; p=n; } } void CreateDListByTail(Dnode *c,int a[],int length) { int i=0; Dnode *n,*p; p=c; for(i=0;i<length;i++) { n=(Dnode*)malloc(sizeof(Dnode)); n->data=a[i]; n->next=p->next; n->prior=p; p->next=n; p=n; } } void CreateDListByHead(Dnode *c,int a[],int length) { Dnode *p; int i=0; for(i=0;i<length;i++) { p=(Dnode*)malloc(sizeof(Dnode)); p->data=a[i]; p->next=c->next; c->next=p; p->prior=c; } } int SearchAndDeleteDList(Dnode *dlist,int x) { Dnode *p,*q; p=dlist; while(p->next!=NULL) { if(p->next->data==x) break; else p=p->next; } if(p->next==NULL) return 0; else { q=p->next; p->next=q->next; q->next->prior=p; free(q); return 1; } } int SearchAndDeleteList(Lnode *list,int x) { Lnode *p,*q; p=list; while(p->next!=NULL) { if(p->next->data==x) break; else p=p->next; } if(p->next==NULL) return 0; else { q=p->next; p->next=q->next; free(q); return 1; } } void PrintList(Lnode *list) { Lnode *p; p=list->next; printf("This single list is:\n"); while(p!=NULL) { printf("%3d",p->data); p=p->next; } printf("\n"); } void PrintDList(Dnode *dlist) { Dnode *p; p=dlist->next; printf("This double list is:\n"); while(p!=NULL) { printf("%3d",p->data); p=p->next; } printf("\n"); } //合并两个按顺序排列的单链表,合成结果是A链表 void MergeTwoList(Lnode *A,Lnode *B) { Lnode *p=A->next; Lnode *q=B->next; Lnode *r; r=A; r->next=NULL; free(B); while(p!=NULL&&q!=NULL) { if(p->data<=q->data) { r->next=p; p=p->next; r=r->next; } else { r->next=q; q=q->next; r=r->next; } } r->next=NULL; if(p!=NULL) r->next=p; else r->next=q; }
未完待续。。。
相关文章推荐
- 数据结构(第二天)单链表的基本操作,创建单链表,头插法,尾插法,删除节点,查询节点
- 数据结构之链表(1):单链表基本操作
- 数据结构——单链表的基本操作
- 数据结构:单链表操作之如何判断链表是否带环及相关操作
- 数据结构5: 链表(单链表)的基本操作及C语言实现
- (总结)数据结构之链表的基本操作说明和示例(待补充)
- 数据结构中双向链表的基本操作(源代码)
- 数据结构—单链表的部分基本操作(C语言)
- 数据结构——单链表的基本操作
- 数据结构实验一--单链表的基本操作的算法
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- 【数据结构】单链表的基本操作
- 数据结构(1):单向链表的基本操作
- 数据结构——链表的基本操作
- 数据结构——单链表及其基本操作
- 实战数据结构(5)_双向循环链表的基本操作
- 【数据结构】单链表的基本操作
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- 数据结构——几种链表基本操作
- 数据结构与算法-链表的基本操作---ShinPans