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
}
}
}
这嫌念是个很简单的链表创建和输出
#include<stdio.h>
#include<stdlib.h>
typedef struct linkednode
{
char data
struct linkednode *next
}node,*link_list//链表节点的结构及重命名
link_list creat()//创建一个逗判链表返回类型是链表的首地址
{
link_list L
node *p1,*p2
char data
L=(node*)malloc(sizeof(node))//开辟存储空间
p2=L
while((data=getchar())!='\n')//输入回车键时结束输入
{
p1=(node*)malloc(sizeof(node))
p1->data=data
p2->next=p1
p2=p1
}
p2->山者改next=NULL
return L
}
void print(link_list L)//把链表输出
{
node *p
p=L->next
while(p!=NULL)
{
printf("%c",p->data)
p=p->next
}
printf("\n")
}
void main()
{
link_list L=NULL
char x
printf("请输入链表节点:\n")
L=creat()
print(L)
}
//兄弟,好好看看带头结点和不带头结点的链表的区别,还有如果你设了全局变量n记录链表长度,length()这个函数就多余了,你可以在删除数据时把n-1,插入数据时把n+1就行了,我简单改了改,你看看吧!!#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
int data
struct node *next
}slink
int n
slink *creat() //创建链表
int insert(slink *head,int i,int x)//在结点i之前播放一个数x
int del(slink *head,int i,int *x) //删除第i个结点并返回该结点上的数值
slink *get(slink *head,int i) //查找第i个结点,并返回
int length(slink *head) //求链表的长度
void print(slink *head) //输出链表
int main()
{
slink *head
int de,num=0,ins,len //de为要删除的结点,ins为要插入的结点
//这里num要用整形数,不用指针
printf("input records:\n")
head=creat()
print(head)
printf("\ninput the delete number:(the number<%d)",n)
scanf("%d",&de) /键含笑/这里少了一个&符
if(del(head,de,&num)==1)
{
print(head)
printf("%d",num)
}
else
printf("delete failure!")
printf("\ninput the inset record:")
scanf("%d",&ins)
if(insert(head,2,ins)==1)
print(head)
else
printf("the insert is failure!")
len=length(head)
printf("the length is %d\n",len)
return 0
}
slink *creat() /*定义函数,返回带头结点的链表*/ //兄弟,你建的是不带头结点的链表,带头结点的链表的头结点是不存数据的!!!
{
slink *head
slink *p1,*p2
n=0
head=NULL
p1=p2=(slink*)malloc(sizeof(slink))
scanf("%d",&p1->data)
while(p1->data!=0)
{
n=n+1
if(n==1) head=p1
else p2->next=p1
p2=p1
p1=(slink*)malloc(sizeof(slink))
scanf("%d",&p1->data)
}
p2->next=NULL
return (head)
}
int insert(slink *head,int i,int x)
{
slink *p,*pre,*q
int j=0
p=(slink*)malloc(sizeof(slink))
p->data=x
pre=head/*pre指向待插入结点的前驱结点*/
q=head->next /*q指向当前比较结点*/
while(q&&j<i-1) /*查找p结点应该插入的位置*/
{pre=q
q=q->next
j++
}
if(j!=i-1||i<1) return 0 /*插入不成功*/老局
else
{p->next=q /*将p结点插入链表*/
pre->next=p
}
return 1 /*插入成功*/
}
int del(slink *head,int i,int *x)/*删除第i个结点稿含,并通过x返回值*/
{
slink *p,*q
int j=0
p=head
while(p->next&&j<i-1) /*查找第i个结点的前驱位置p*/
{
p=p->next
j++
}
if(!(p->next)||j>i-1) return 0 /*删除位置不合适*/
q=p->next /*删除并释放结点*/
p->next=q->next
*x=q->data
free(q)
n-- //删除了数据,总数n应该减1吧?
return 1
}
slink *get(slink *head,int i) /*查找第i个结点*/
{slink *p
int j=0
p=head
while(p->next&&j<i-1) /*查找第i个结点的前驱*/
{p=p->nextj++}
if(!(p->next)&&j>i-1) return NULL
return p->next
}
int length(slink *head) /*求表的长度*/
{int len=0
slink *p
p=head /*设该表有表头*/
while(p){p=p->nextlen++} //你建的是不带头链表,所以这里少了一个
return len
}
void print(slink *head)
{slink *p
printf("\nNow,these %d records are :\n",n)
p=head
if(head!=NULL)
do
{printf("%d \n",p->data)
p=p->next
}while(p!=NULL)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)