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)
}
请采纳,谢谢