c语言建立循环链表
A. 如何用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;
}
B. 关于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);
}
}
}
C. c语言建立链表的问题,请讲循环语句中的几句详细解释下。
while(x!=-1)//若输入-1,创建链表结束,不再执行循环体
{
s=(struct
node
*)malloc(sizeof(struct
node));//创建节点,
s->data=x;//把输入的数据保存在当前创建的节点
r->next=s;//把当前创建节点的地址赋给上个节点的指针,形成链表
r=s;//保存当前创建的节点s到r,方便循环创建链表节点
scanf("%d",&x);
}
r->next=NULL;//把尾节点的指针指向NULL,表示链表的结束
D. 【悬赏】C语言,数据结构,循环链表问题!
1、指针指向一个结点是指利用此指针可以直接访问这个结点,包括这个结点的data和next所以指针指向最后一个结点,代表这个指针是最后一个结点的地址
2、循环链表是最后一个结点的next域指向头结点,上面的方法是尾插法建链表,新建的结点插在表尾,即为最后一个结点,所以每建一个,其next域就应修改为head
3、//La和Lb是两个仅设尾指针的循环链表
//将Lb合并到La的表尾,由La指示新表
void MergeList(LinkList * La,LinkList Lb)
{
LinkList p = Lb->next;
Lb->next = (* La)->next;
(* La)->next = p->next;
free(p);
(* La) = Lb;
}
E. c语言循环单链表的创建.有句程序不明白高人帮忙指导一下,十分感谢
楼主第一个函数是一个数据存储的函数吧
先解释下3个指针变量的作用
*head:用于保存头文件的指针
*p:用于指向当前的下一个地址,只起到临时作用
*q:用于保存当前位置的地址
函数逻辑是用*head保存头指针,然后先移动*p,如果*p指向的是*head,说明这条链只有一个节点,就是头地址(头指针指向的地址),既然要继续,所以需要if(head->next==head)这句来判断是否*p指向的是头地址;如果不是*p指向的不是头地址,那么*p前移,然后*q也前移,*p一定要比*q先前移,所以*p在*q前面。
如果输入完毕了,及输入了回车号<CR>,结束输入,然后*q指向头*head。
那个print()函数是用来输出的,输出除了第一个元素以后的字母。
p=tail->next->next这句话就是p指向tail的下一个的下一个元素的地址,首先,p的初始值是上面的head头地址的内容,里面什么都没有,所以要一个next指向下一个,那么再下一个,就是第二个字母了,具体为什么要从第2个字母开始输出,就要问你了,不懂这个print()的目的。
哈哈,你的第一个函数返回的应该是q
F. 循环链表怎么建立。c语言
是的
建立单向循环链表的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct _A{
int data;
stru<img id="selectsearch-icon" src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/qb/select-search.png" alt="搜索">ct _A *next;
}A;
typedef A* IA;
void createDoubleLink(IA *header) {
int data;
IA p;
printf("input data end with -1:");
scanf("%d", &data);
while(data != -1) {
p = (IA)malloc(sizeof(A));
p->data = data;
if(*header == NULL) {
*header = p;
(*header)->next = *header;
}
else{
IA q = *header;
while(q->next != *header) {
q = q->next;
}
q->next = p;
q->next->next = *header;
}
scanf("%d", &data);
}
}
void print(IA header) {
IA p = header;
if(header == NULL) return;
while(1){
printf("%d\t", p->data);
if(p->next == header) break;
p = p->next;
}
printf("\n");
}
int main()
{
IA header = NULL;
createDoubleLink(&header);
print(header);
return 0;
}
头结点的意思是链表的第一个节点,但这个节点不保存数据。
G. 数据结构双向循环链表的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;
}
H. 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);
}