您的位置:首页 > 理论基础 > 数据结构算法

数据结构之单链表、双链表的基本操作

2013-04-29 13:32 781 查看
单链表双链表中经常纠结的概念:
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;
}


未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: