如何创建单链表

如何创建单链表,第1张

这我原来写的,有单链表的建立、插入、删除、查找等,希望对你有帮助

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 Elemtype

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

}

}

}

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))

链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

以上内容参考:百度百科-单链表


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8089217.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存