怎样编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本 *** 作?

怎样编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本 *** 作?,第1张

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

}

}

}

二、单链表枯基的基本运算

建立了一个单链表之后,如果要进行一些如插入、删除等 *** 作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些 *** 作。单链表的基本运算包括:查找、插入和删除。下面我们就一一介绍这三种基本运算的算法,并结合我们建立单链表的例子写出相应的程序。

1、查找

对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回NULL。

因为在单链表的链域中包含了后继结点的存储地址,所以当我们实现的时候,只要知道该单链表的头指针,即可依次对每个结点的数据域进行检测。

以下是应用查找算法的一个例州败笑子:

#include

#include

#include /*包含一些字符串处理函数的头文件*/

#define N 10

typedef struct node

{

char name[20]

struct node *link

}stud

stud * creat(int n) /*建立链表的函数*/

{

stud *p,*h,*s

int i

if((h=(stud *)malloc(sizeof(stud)))==NULL)

{

printf("不能分配内存空间!")

exit(0)

}

h->name[0]='\0'

h->link=NULL

p=h

for(i=0i<ni ) {

if((s= (stud *) malloc(sizeof(stud)))==NULL)

{

printf("不能分配内存空间!")

exit(0)

}

p->link=s

printf("请输入第%d个人的姓名册含",i 1)

scanf("%s",s->name)

s->link=NULL

p=s

}

return(h)

}

stud * search(stud *h,char *x) /*查找链表的函数,其中h指针是链表的表头指针,x指针是要查找的人的姓名*/

{

stud *p/*当前指针,指向要与所查找的姓名比较的结点*/

char *y/*保存结点数据域内姓名的指针*/

p=h->link

while(p!=NULL)

{

y=p->name

if(strcmp(y,x)==0) /*把数据域里的姓名与所要查找的姓名比较,若相同则返回0,即条件成立*/

return(p)/*返回与所要查找结点的地址*/

else p=p->link

}

if(p==NULL)

printf("没有查找到该数据!")

}

main()

{

int number

char fullname[20]

stud *head,*searchpoint/*head是表头指针,searchpoint是保存符合条件的结点地址的指针*/

number=N

head=creat(number)

printf("请输入你要查找的人的姓名:")

scanf("%s",fullname)

searchpoint=search(head,fullname)/*调用查找函数,并把结果赋给searchpoint指针*/

}


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

原文地址:https://54852.com/yw/8194835.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存