C语言数据结构 如何建立单向循环链表并且输入值

Python037

C语言数据结构 如何建立单向循环链表并且输入值,第1张

#include <iostream>

using namespace std

typedef char ElemType

typedef int Status

#define OK 1

#define ERROR 0

typedef struct Lnode

{

ElemType data

struct Lnode *next

}Lnode,*LinkList

void Creat_List(LinkList L)//创建单链表并输入元素

{

LinkList p,q

q=L

char ch

cout<<"请输入链表元素,并且以输入#表示结束!"<<endl

while(cin>>ch&&ch!='#')

{

p=new Lnode[sizeof(Lnode)]

if(!p)

{

cout<<"获取内存失败"<<endl

exit(ERROR)

}

p->data=ch//尾插法

L->next=p

L=p

}

L->next=q

}

void output_List(LinkList L)//遍历单链表(输出单链表元素)

{

LinkList p

p=L->next

if(p==L)

{

cout<<"该链表是空链表!"<<endl

exit(ERROR)

}

while(p!=L)

{

cout<<p->data<<"   "

p=p->next

}

}

Status main()

{

LinkList H

H=(LinkList)malloc(sizeof(Lnode))

H->next=NULL//设置头结点为空

    Creat_List(H)

output_List(H)

return 0

}//头结点有和没有都是可以的,头结点只是为了让操作链表更方便,

#include<stdlib.h>

#include "nodedef.h"

#define CreateLinklistWay 1 // 0表示头插法创建链表,1表示尾插法创建链表

#if !CreateLinklistWay

/*********************************************************************

* 函数名称:linklist *CreateLinklistHead()

* 函数功能:利用头插法创建链表

* 参数:无

* 返 回 值:创建完链表后的链表头结点

* 说明:无

*********************************************************************/

extern linklist *CreateLinklistHead()

{

int x, i, nodeNum

linklist *head, *temp // 头结点与临时结点

head = (linklist *)malloc(sizeof(linklist)) // 生成表头结点

head->next = NULL // 给表头结点的指针域赋值

printf("请输入链表中结点的个数:")

scanf("%d", &nodeNum)

for(i=1i<=nodeNumi++)

{

printf("请输入第 %d 个结点的数据:", i)

scanf("%d", &x)

temp = (linklist *)malloc(sizeof(linklist)) // 生成新的结点

temp->data = x // 对新结点的数据域赋值

// 将新结点插到头结点之后

temp->next = head->next

head->next = temp

}

return head // 返回新建链表的头结点

}

#else

/*********************************************************************

* 函数名称:linklist *CreateLinklistRear()

* 函数功能:利用尾插法创建链表

* 参数:无

* 返 回 值:创建完链表后的链表头结点

* 说明:无

*********************************************************************/

extern linklist *CreateLinklistRear()

{

int x, i, nodeNum

linklist *head, *rear, *temp // 定义头结点、尾结点和临时结点

head = (linklist *)malloc(sizeof(linklist)) // 生成表头结点,表头结点不存放数据

head->next = NULL // 将表头结点的指针域赋值为NULL

rear = head // 将表头结点赋值给表尾结点

printf("请输入链表中结点的个数:")

scanf("%d", &nodeNum)

for(i=1i<=nodeNumi++)

{

printf("请输入第 %d 个结点的数据:", i)

scanf("%d", &x)

temp = (linklist *)malloc(sizeof(linklist)) // 生成新的结点

temp->data = x // 新增结点的数据域

temp->next = NULL// 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)

rear->next = temp// 使前一个结点指向新增结点(head->next=temp)

rear = temp // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)

}

//rear->next = NULL // 将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)

return head // 返回头结点

}

#endif

你在创建的时候不能对链表L指针进行偏移

需要建临时指针:

修改如下:

#include<stdio.h>

#include<malloc.h>

typedef struct Lnode

{

int data

struct Lnode * next

}Lnode,*Linklist

void creat_list(Linklist &L)

{

Linklist p

L=(Linklist)malloc(sizeof(Lnode))

Linklist temp = L

p=(Linklist)malloc(sizeof(Lnode))

scanf("%d",&p->data)

while((p->data)!=0)

{

temp->next=p

temp=p

p=(Linklist)malloc(sizeof(Lnode))

scanf("%d",&p->data)

}

temp->next=NULL

}

void print_list(Linklist L)

{

Linklist s

s=L->next

while(s)

{

printf("%d",s->data)

s=s->next

}

}

void main()

{

Linklist L

printf("创建单链表")

creat_list(L)

printf("输出单链表")

print_list(L)

}

请采纳,谢谢