typedef struct node{
int data
struct node *next
}node
node *create()
{
node *head,*p,*q
int i=0
int x
head=(node *)malloc(sizeof(node))
while(1)
{
printf("please input the node:")
scanf("%d",&x)
if(x==0) {break}
p=(node *)malloc(sizeof(node))
p->data=x
if(++i==1)
{
head->next=p
}
else
{
q->next=p
}
q=p
}
q->next=NULL
return head
}
void print(node *head)
{
node *p
int index=0
if(head->next==NULL)
{
printf("Link is empty!\n")
exit(0)
}
p=head->next
while(p!=NULL)
{
printf("the %d node is %d\n",++index,p->data)
p=p->next
}
}
int length(node *head)
{
int len=0
node *p
p=head->next
while(p)
{
len++
p=p->next
}
return len
}
node *search(node *head,int pos)
{
node *p
int len=length(head)
p=head->next
if(pos<0)
{
printf("incorrect position!\n")
return NULL
}
else if(pos>len)
{
printf("incorrect position!\n")
return NULL
}
else if(pos==0)
{
return head
}
if(p==NULL)
{
printf("the link is empty!\n")
return NULL
}
while (--pos)
{
p=p->next
}
return p
}
node *delete(node *head,int pos)
{
node *p,*q
int len=length(head)
p=head->next
if(pos<0)
{
printf("incorrect position!\n")
return NULL
}
else if(pos>len)
{
printf("incorrect position!\n")
return NULL
}
if(p==NULL)
{
printf("link empty!\n")
return NULL
}
p=search(head,pos-1)
if(p!=NULL&&p->next!=NULL)
{
q=p->next
p->next=q->next
free(q)
}
return head
}
node *insert(node *head,int pos,int x)
{
node *p,*q=NULL
q=(node *)malloc(sizeof(node))
q->data=x
if(pos==0)
{
head->next=q
return head
}
p=search(head,pos)
if(p!=NULL)
{
q->next=p->next
p->next=q
}
return head
}
typedef int Elemtypetypedef 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
}
}
}
int main()
{
Link head//链表(不带头节点)
int n
printf("输入链表的长度n: ")
scanf("%d",&n)
printf("连续输入%d个数据(以空格隔开): ",n)
head=CreateLink(n)
printf("\n原本链表的节点是: ")
DispLink(head)
LinkSort(head)
printf("\n从大到小排序之后: ")
DispLink(head)
printf("\n")
return 0
}
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。
以上内容参考:百度百科-单链表
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)