1. 数据结构双向循环链表的c语言实现(插入,查询,删除),代码如下:
#include<stdio.h>
#include<malloc.h>
typedefintElemtype;
typedefstructdNode{
Elemtypedata;/*数据域*/
structdNode*prior;/*指向前驱结点的指针域*/
structdNode*next;/*指向后继结点的指针域*/
}*pDLink,*DLinkList;
DLinkListGetEmptyDLink(){//初始化
DLinkListhead=(pDLink)malloc(sizeof(structdNode));
head->data=0;
head->prior=head;
head->next=head;
returnhead;
}
voidDLink_create(DLinkListhead,intn){/*双向循环链表建立函数*/
inti;
pDLinkp,r;
p=r=head;
for(i=0;i<n;i++){
p->next=(pDLink)malloc(sizeof(structdNode));/*为一个新结点分配空间*/
scanf("%d",&p->next->data);/*从键盘输入值,并保存在新结点数据域中*/
p=p->next;//p指向新结点
p->prior=r;//新结点的prior指向上一个结点
r=r->next;//上一个结点前进到新结点
}
p->next=head;//指向头结点
head->prior=p;//head的prior指向最后的结点
}
voidShow(DLinkListhead){//正向显示链表数据
pDLinkp=head->next;
while(p!=head){
printf("%d",p->data);
p=p->next;
}
printf(" ");
}
voidShowR(DLinkListhead){//反向显示数据
pDLinkp=head->prior;
while(p!=head){
printf("%d",p->data);
p=p->prior;
}
printf(" ");
}
intmain(){
DLinkListhead=GetEmptyDLink();
DLink_create(head,10);
printf("正向显示: ");
Show(head);
printf("反向显示: ");
ShowR(head);
return0;
}
2. C语言怎么动态生成单循环链表
在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。
链表的C语言实现之循环链表及双向链表
一、循环链表
循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。
循环链表的运算与单链表的运算基本一致。所不同的有以下几点:
1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL.此种情况还使用于在最后一个结点后插入一个新的结点。
2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL.
二、双向链表
双向链表其实是单链表的改进。
当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。
在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。
3. 带有头结点的的循环双链表的实现和相关操作C语言
#include <stdio.h>
struct node
{
int a;
node *pre;//指向前节点的指针
node *pos;//指向后节点的指针
};
int main()
{
int i=0;
node *head,*tmp;
tmp=head=new node;
head->a=0;
for(i=1;i<20;i++)
{
tmp->pos=new node;
tmp=tmp->pos;
tmp->a=i;
}
tmp->pos=head;//闭环
tmp=tmp->pos;
while(tmp->pos!=head)
{
tmp->pos->pre=tmp;
tmp=tmp->pos;
}
tmp->pos->pre=tmp;
//输出测试
tmp=head;
do
{
printf("%d ",tmp->a);
tmp=tmp->pos;
}while(tmp!=head);
printf("\n");
tmp=head->pre;
do
{
printf("%d ",tmp->a);
tmp=tmp->pre;
}while(tmp!=head->pre);
printf("\n");
//删除链表
head->pre->pos=NULL;
while(head)
{
tmp=head;
head=head->pos;
delete tmp;
}
return 0;
}
4. 关于C语言版数据结构中的单循环链表
void showlist(linklist head){//遍历输出链表
listnode *p;
p=head;
if(p->next=head){//这行里的p->next=head应写成p->next==head
printf("list is empty!\n");
return;
}
else{
while((p=p->next)!=head){
printf("%d ",p->data);
}
}
}
5. C语言数据结构 如何建立单向循环链表并且输入值
#include<iostream>
usingnamespacestd;
typedefcharElemType;
typedefintStatus;
#defineOK1
#defineERROR0
typedefstructLnode
{
ElemTypedata;
structLnode*next;
}Lnode,*LinkList;
voidCreat_List(LinkListL)//创建单链表并输入元素
{
LinkListp,q;
q=L;
charch;
cout<<"请输入链表元素,并且以输入#表示结束!"<<endl;
while(cin>>ch&&ch!='#')
{
p=newLnode[sizeof(Lnode)];
if(!p)
{
cout<<"获取内存失败"<<endl;
exit(ERROR);
}
p->data=ch;//尾插法
L->next=p;
L=p;
}
L->next=q;
}
voidoutput_List(LinkListL)//遍历单链表(输出单链表元素)
{
LinkListp;
p=L->next;
if(p==L)
{
cout<<"该链表是空链表!"<<endl;
exit(ERROR);
}
while(p!=L)
{
cout<<p->data<<"";
p=p->next;
}
}
Statusmain()
{
LinkListH;
H=(LinkList)malloc(sizeof(Lnode));
H->next=NULL;//设置头结点为空
Creat_List(H);
output_List(H);
return0;
}//头结点有和没有都是可以的,头结点只是为了让操作链表更方便,
6. 如何用C语言编写一个链表
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct Node
{
int data;//数据域
struct Node * next;//指针域
};
/*************************************************************************************
*函数名称:Create
*函数功能:创建链表.
*输入:各节点的data
*返回值:指针head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函数名称:insert
*函数功能:在链表中插入元素.
*输入:head 链表头指针,p新元素插入位置,x 新元素中的数据域内容
*返回值:无
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函数名称:del
*函数功能:删除链表中的元素
*输入:head 链表头指针,p 被删除元素位置
*返回值:被删除元素中的数据域.如果删除失败返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函数名称:print
*函数功能:打印链表中的元素
*输入:head 链表头指针
*返回值:无
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函数名称:main
*函数功能:主函数创建链表并打印链表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}
7. C语言建立循环链表
#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct list
{
int num;
struct list *next;
}List;
int n=0;
List *creat()
{
List *head,*p1,*p2;
int i;
if((head=(List *)malloc(sizeof(List)))==NULL)
{
printf("Error");
exit(0);
}
p1=p2=head;
printf("输入创建链表的长度:");
scanf("%d",&head->num);//创建列表,带头结点,头结点数据域表示输入的个数
if(head->num==0)
{
head->next=NULL;
printf("已创建带头结点的空链表");
}
else
{
printf("输入数据:\n");
for(i=0;i<head->num;i++)
{
if((p1=(List *)malloc(sizeof(List)))==NULL)
{
printf("Error");
exit(0);
}
scanf("%d",&p1->num);
p2->next=p1;
p2=p1;
}
p1->next=head;
}
return(head);
}
void print(List *head)
{
List *p;
p=head->next;
for(;p!=head;)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
void main()
{
List *head;
head=creat();
print(head);
}
8. 用C语言实现链表的算法
这个是我们数据结构上机实验的链表问题,
#include<stdio.h>
#include<malloc.h>
#define
LEN
sizeof(LinkNode)
typedef
int
Datatype;
typedef
int
Status;
typedef
struct
LinkNode{
Datatype
data;
struct
LinkNode
*next;
}
LinkNode,*LinkList;
typedef
struct
OrderedList
{
LinkNode
*head,*tail;
int
Listsize;
}
OrderedList;//有序循环链表的头节点head,尾接接节点
tail及长度Listsize
Status
InitList(OrderedList
*List)//生成循环链表头节点
{
List->tail=List->head=(LinkList)malloc(LEN);
if(List->head==NULL)
return
0;
else
{
List->head->next=List->tail;
List->tail->next=List->head;
List->Listsize=0;
return
1;
}
}
void
OrderedInsert(OrderedList
*List,Datatype
data)//每调用一次有序插入data形成有序的(从小到大)的链表
{
LinkNode
*p
,*q;
if(List->head==List->tail->next)
{
p=(LinkNode*)malloc(LEN);
p->data
=
data;
List->head->next=p;
p->next=List->tail;
List->Listsize++;
}
else
{
p=List->head->next;
q
=
List->head;
while(p->data<data&&p!=List->tail)
{
q
=
p;
p=p->next;
}
if(p->data==data)
{printf("YOu
have
input
the
same
datas
%d\n\t
YOu
should
input
another
data
\n",data);
scanf("%d",&data);
OrderedInsert(List,data);
}
else
{
p=(LinkNode*)malloc(LEN);
p->data
=
data;
p->next
=
q->next;
q->next
=
p;
List->Listsize++;
}
}
}
void
Creatset(OrderedList
*List)//多次调用OrderedInsert()生成有序链表即集合List
{
Datatype
data;
int
setsize
,
i=0;
printf("Please
input
the
setsize
you
want
to
creat:\n");
scanf("%d",&setsize);
InitList(List);
if(setsize==0)
printf("You
needen't
input
any
data\n");
else
if(setsize==1)
printf("Please
input
a
single
data\n");
else
printf("Please
input
%d
different
datas;\n",setsize);
while(i<setsize||setsize>List->Listsize)//当循环次数i小于setsize或者集合内实际元素数List.Listsize小于setsize时一直循环下去
{
scanf("%d",&data);
OrderedInsert(List,data);
i++;
}
}
void
Append(OrderedList
*List,Datatype
data)//在循环链表的最后面追加
一个data
{
LinkNode
*p;
p=(LinkNode*)malloc(LEN);
p->data=data;
List->tail=List->tail->next=p;
List->tail->next=List->head;
List->Listsize+=1;
}
void
MergeList(OrderedList
La,OrderedList
Lb,OrderedList
*Lc)//有序循环链表ListLa,ListLb求并集生成ListLc
{
LinkList
Pa,Pb;
Pa=La.head->next;Pb=Lb.head->next;
while(Pa!=La.tail&&Pb!=Lb.tail)
{
if(Pa->data<=Pb->data)
{
Append(Lc,Pa->data);
Pa=Pa->next;
}
else
{
Append(Lc,Pb->data);Pb=Pb->next;
}
}
while(Pa!=La.tail)
{
Append(
Lc,Pa->data);Pa=Pa->next;}
while(Pb!=Lb.tail)
{
Append(Lc,Pb->data);Pb=Pb->next;}
}
void
Print(OrderedList
List)
{
LinkNode
*p;
p=List.head->next;
if(p->next==List.head)
printf("No
Elem\n");
while(p!=List.head)
{
printf("%5d",p->data);p=p->next;
}
printf("\n");
}
void
main()
{
OrderedList
ListLa,ListLb,ListLc;
Creatset(&ListLa);
Creatset(&ListLb);
InitList(&ListLc);
MergeList(ListLa,ListLb,&ListLc);
printf("The
orgnial
list
ListLa,ListLb:\n");
Print(ListLa);
Print(ListLb);
printf("The
Merge
list
ListLc;\n");
Print(ListLc);
}
9. 循环链表怎么建立。c语言
你好,循环链表就是普通链表的最后一个节点的Next指针指向第一个节点就好啦