typedef int status
#define OVERFLOW -2
#define OK 1
#define ERROR -1
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode {
Elemtype data
struct LNode *next
}*linklist
/档绝/构造链表毁亮
void Create_Linklist(linklist &L)
{
linklist p
p=(linklist)malloc(sizeof(LNode))
if(!p)
exit(OVERFLOW)
L=p
L->next =NULL
}
//节点插入
void Insert_Linklist(linklist &L)
{
linklist p
int n,i
printf("请输入插入节点的个数n: ")
scanf("%d",&n)
getchar()
for(i=ni>0i--)
{
p=(linklist )malloc(sizeof(LNode))
scanf("%d",&p->data)
p->next=L->next
L->next =p
}
}
//遍历输出并输出长度
status Visit_linklist(linklist &L)
{
linklist p
int i=1
p=L->next
if(L->next==NULL)
return ERROR
while(p->next !=NULL)
{
printf("%d ",p->data )
p=p->next
i++
}
printf("%d\n",p->data )
printf("长度为:%d\n",i)
return OK
}
//查找值为x的直接前驱结点q并输出
void Search_linklist(linklist &L)
{
int x,k=0
linklist p=L,q
printf("输入x: ")
scanf("%d",&x)
getchar()
if(L->next ==NULL)
printf("该表为空 !\n")
while(p->next!=NULL)
{
q=p
if(p->next ->data ==x)
{
printf("%d ",q->data )
k=1
}
p=p->next
}
if(p->next &&p->data ==x)
{
printf("%d ",p->data )
k=1
}
if(k==0)
printf("未找到值为%d的结点\n",&x)
printf("\n")
}
/行余姿/删除节点
status Delete_linklist(linklist &L)
{
linklist p,q
int k=0,x
printf("请输入删除节点的值x: ")
scanf("%d",&x)
getchar()
if(L->next ==NULL)
return ERROR
p=L
q=L->next
while(q!=NULL)
if(q->data ==x)
{
k=1
p=q
p->next =q->next
free(q)
q=p->next
}
else
{
p=q
q=p->next
}
if(k==0)
printf("表中没有值为%d的结点!\n",&x)
return OK
}
//链表逆置
void ListInverse_linkliast(linklist &L)
{
linklist k,p,q
p=L
while (p->next !=NULL)
{
p=p->next
}
k=p
while (L->next !=p)
{
q=L->next
L->next = q->next
k->next =q
}
}
//链表奇偶分解
void Break_linklist (linklist &La,linklist &Lb)
{
linklist p,q
p=La->next
q=Lb
while(p->next!=NULL)
{
if(p->data %2==0)
{
q->next =p
q=q->next
}
p=p->next
}
if(p->data %2==0)
{
q->next =p
q=q->next
}
}
//主菜单
void main()
{
linklist L1,L2
printf(" (1) 建立带头节点的单链表\n")
printf(" (2) 插入节点\n")
printf(" (3) 计算链表长度并输出单链表\n")
printf(" (4) 查找值为x的直接前驱结点并输出其值\n")
printf(" (5) 删除节点值为x的结点\n")
printf(" (6) 逆置单链表结点\n")
printf(" (7) 单链表奇偶分解\n")
int choice
printf(" 请输入选择:")
while(scanf("%d",&choice))
{
getchar()
printf("\n\n")
switch(choice)
{
case 1:
Create_Linklist(L1)
break
case 2:
Insert_Linklist(L1)
break
case 3:
Visit_linklist(L1)
break
case 4:
Search_linklist(L1)
break
case 5:
Delete_linklist(L1)
break
case 6:
ListInverse_linkliast(L1)
break
case 7:
Create_Linklist(L2)
Break_linklist (L1,L2)
break
default:
printf(" 输入有误!")
break
}
}
}
C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
int data
node * next
}node , * List
void create(int n)
{
int c
List s,L
L=(List)malloc(sizeof(node))
L->next=NULL
printf("请输入第1个数据:")
scanf("%d",&c)
L->data=c
for(int i=2i<=ni++)
{
s=(List)malloc(sizeof(node))
printf("请输入第%d个数据:",i)
scanf("%d",&c)
s->data=c
s->next=L
L->next =s
}
printf("链表创建成功!"亏慎)
}
void main()
{
int n
printf("请你输入链表的个数:")
scanf("%d",&n)
create(n)
}
单链表销胡敬创建方法:
单链表的建立有头插法、尾插法两种方法。
1. 头插法
单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。
由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立做亮一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。
链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。
2. 尾插法
若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。
主函数这里
Linklist Listprintf("输入创建链表的长度:")
scanf("%d",&num)
CreateList_H(List,num) //创建链表
改为
LNode List
printf("输入创建链此缓表的长度:")
scanf("%d",&num)
CreateList_H(&List,num) //创建链表
函数内在堆上分配好内存,但是 没有传递到栈上
另外 你的变量名很闷备迷人森罩模
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)