模拟双链表简单操作.

_谦言万语 2022-09-22 21:38:46
#include <stdio.h>
#include <malloc.h>

typedef struct DNode
{
	char data;
	struct DNode *prior;
	struct DNode *next;
}DLinkNode;

void CreateListF(DLinkNode *&L, char a[], int n)
{
	DLinkNode *s;
	L=(DLinkNode *)malloc(sizeof(DLinkNode));
	L->prior=L->next=NULL;
	for(int i=0; i<n; i++)
	{
		s=(DLinkNode *)malloc(sizeof(DLinkNode));
		s->data=a[i];
		s->next=L->next;
		if(L->next!=NULL) L->next->prior=s;
		s->prior=L;
		L->next=s;
	}
}

void CreateListR(DLinkNode *&L, char a[], int n)
{
	DLinkNode *s,*r;
	L=(DLinkNode *)malloc(sizeof(DLinkNode));
	L->prior=L->next=NULL;
	r=L;
	for(int i=0; i<n; i++)
	{
		s=(DLinkNode *)malloc(sizeof(DLinkNode));
		s->data=a[i];
		r->next=s;
		s->prior=r;
		r=s; //往后挪一位 
	}
	r->next=NULL; 
} 

void InitList(DLinkNode *&L)
{
	L=(DLinkNode *)malloc(sizeof(DLinkNode));
	L->prior=L->next=NULL;
}

void DestroyList(DLinkNode *&L)
{
	DLinkNode *pre=L, *p=L->next;
	while(p!=NULL)
	{
		free(pre);
		pre=p;
		p=p->next;
	}
	free(pre);
}
bool ListEmpty(DLinkNode *L)
{
	return (L->next==NULL);
} 

int ListLength(DLinkNode *L)
{
	DLinkNode *p=L;
	int i=0;
	while(p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
}

void DispList(DLinkNode *L)
{
	DLinkNode *p=L->next;
	while(p!=NULL)
	{
		printf("%c ",p->data);
		p=p->next;
	}
	printf("\n");
}

bool ListInsert(DLinkNode *&L, int i, char e)
{
	int j=0;
	DLinkNode *p=L, *s;
	if(i<=0) return false;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL) return false;
	else 
	{
		s=(DLinkNode *)malloc(sizeof(DLinkNode));
		s->data=e;
		s->next=p->next;
		if(p->next!=NULL) p->next->prior=s;
		s->prior=p;
		p->next=s;
		return true;
	}
}

//删除的是q指向的结点 
bool ListDelete(DLinkNode *&L,int i)
{
	int j=0;
	DLinkNode *p=L,*q;
	if(i<=0) return false;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL) return false;
	else
	{
		q=p->next;
		if(q==NULL) return false;
		p->next=q->next;
		if(q->next!=NULL)
			q->next->prior=p; 
		free(q);
		return true;
	}
}

bool GetElem(DLinkNode *L,int i,char &e)
{
	int j=0;
	DLinkNode *p=L;
	if(i<=0) return false;
	while(j<i && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL) return false;
	else
	{
		e=p->data;
		return true;
	}
}

int LocateElem(DLinkNode *L,char e)
{
	int i=1;
	DLinkNode *p=L->next;
	while(p!=NULL && p->data!=e)
	{
		i++;
		p=p->next;
	}
	if(p==NULL) return 0;
	else return i;
}

int main()
{
	DLinkNode *h;
	char e;
	printf("双链表的基本运算如下:\n");
	printf("  (1)初始化双链表h\n");
	InitList(h);
	printf("  (2)依次采用尾插法插入a,b,c,d,e元素\n");
	ListInsert(h,1,'a'); 
	ListInsert(h,2,'b');
	ListInsert(h,3,'c');
	ListInsert(h,4,'d');
	ListInsert(h,5,'e');
	printf("  (3)输出双链表h:"); DispList(h);
	printf("  (4)双链表h的长度:%d\n",ListLength(h));
	printf("  (5)双链表h为%s\n",(ListEmpty(h) ? "空" : "非空"));
	GetElem(h,3,e);
	printf("  (6)双链表h的第3个元素:%c\n",e);
	printf("  (7)元素a的位置:%d\n",LocateElem(h,'a'));
	printf("  (8)在第4个元素位置上插入f元素\n");
	ListInsert(h,4,'f'); 
	printf("  (9)输出双链表h:"); DispList(h);
	printf("  (10)删除h的第3个元素\n");
	ListDelete(h,3);
	printf("  (11)输出双链表h:"); DispList(h);
	printf("  (12)释放双链表h\n");
	DestroyList(h);
	return 0;
} 

 

...全文
7 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
#include"stdio.h" #include typedef char ElemType; typedef struct LNode {ElemType data; struct LNode *next; }LinkList; void CreatListF(LinkList *&L,ElemType a[],int n) //头插法建 { LinkList *s;int i; L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; for(i=0;idata=a[i]; s->next=L->next; L->next=s; } } void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建 { LinkList *s,*r;int i; L=(LinkList *)malloc(sizeof(LinkList)); r=L; for(i=0;idata=a[i]; r->next=s; r=s; } r->next=NULL; } void InitList(LinkList *&L) //初始化线性 { L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; } void DestroyList(LinkList *&L) //销毁线性 { LinkList *p=L,*q=p->next; while(q!=NULL) { free(p); p=q; q=p->next; } free(p); } int ListEmpty(LinkList *L) //判断线性是否为空 { return(L->next==NULL); } int ListLength(LinkList *L) //求线性的长度 { LinkList *p=L;int n=0; while(p->next!=NULL) { n++;p=p->next; } return(n); } void DispList(LinkList *L) //输出线性 { LinkList *p=L->next; while(p!=NULL) { printf("%c",p->data); p=p->next; } } int GetElem(LinkList *L,int i,ElemType &e) //求线性中某个数据元素值 { int j=0; LinkList *p=L; while(jnext; } if(p==NULL) return 0; else { e=p->data;return 1; } } int LocateElem(LinkList *L,ElemType e) //按元素值查找 { LinkList *p=L->next; int i=1; while(p!=NULL&&p->data!=e) { p=p->next;i++; } if(p==NULL)return(0); else return(i); } int ListInsert(LinkList *&L,int i,ElemType e) //插入数据元素 { int j=0; LinkList *p=L,*s; while(jnext; } if(p==NULL)return 0; else { s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; p->next=s; return 1; } } int ListDelete(LinkList *&L,int i,ElemType &e) //删除数据元素 { int j=0; LinkList *p=L,*q; while(jnext; } if(p==NULL) return 0; else { q=p->next; if(q==NULL)return 0; e=q->data; p->next=q->next; free(q); return 1; } } int main() { ElemType e,a[5]={'a','b','c','d','e'}; LinkList *h; InitList(h); //初始化顺序h CreateListR(h,&a[0],5); //依次采用尾插入法插入a,b,c,d,e元素 printf("单链为:"); DispList(h); printf("\n"); //输出顺序h printf("该单链的长度为:"); printf("%d",ListLength(h)); printf("\n"); //输出顺序h的长度 if(ListEmpty(h)) printf("该单链为空。\n"); else printf("该单链不为空。\n"); //判断顺序h是否为空 GetElem(h,3,e);printf("该单链的第3个元素为:"); printf("%c",e); printf("\n"); //输出顺序h的第3个元素 printf("该单链中a的位置为:"); printf("%d",LocateElem(h,'a')); printf("\n"); //输出元素'a'的位置 ListInsert(h,4,'f'); //在第4个元素位置插入'f'素 printf("在第4 个元素位置上插入'f'后单链为:"); DispList(h); printf("\n"); //输出顺序h ListDelete(h,3,e); //删除L的第3个元素 printf("删除第3个元素后单链为:"); DispList(h); printf("\n"); //输出顺序h DestroyList(h); //释放顺序h return 0; }
发帖
高校算法学习社区

2.5w+

社区成员

和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
帖子事件
创建了帖子
2022-09-22 21:38
社区公告

为了充分激发大家的创作热情和发文贡献,这里规定了高效算法学习社区对于积分榜的贡献排行榜的奖措施:

总榜奖励:(截止于2023年4月1日)

1.总榜第一:现金三百元

2.总榜第二与第三:Acwing算法课一套(价值150元可提现)

月榜:(从2020.年4月1日开始,每月一号结算)

1.月榜前三:请喝奶茶一杯

更多详细可看下:https://docs.qq.com/doc/DVnZJbkFPc1BNU2x2