C语言: 链表查询

C语言: 链表查询,第1张

/*

typedef struct list_node

{

Eleme data

struct list_node *next

}List_Node,*plist_node

*/

#include "stdio.h"

#include "malloc.h"

#include "stdlib.h"

#include "time.h"

#include "my_data.h"

plist_node Creat(void)/*链表创建函数*/

{

int len,val//定义列表长度,存放节点数据

plist_node phead = (plist_node)malloc(sizeof(List_Node))//创建分配一个头结点数据

if(phead == NULL)

{

printf("空间分配失败啊!")

exit(-1)

}

plist_node pTail = phead// 链表的末尾节点,初始指向头节点

pTail->next = NULL// 最后一个节点指针置为空

printf("输入节点个数:")

scanf("%d",&len)

for(int i=0i<leni++)

{

plist_node pNew = (plist_node)malloc(sizeof(list_node)) //分配一个新节点

if (pNew == NULL) {

printf("分配新节点失败\n")

exit(-1)

}

printf("请输入第 %d 个节点的数据:", i + 1)

scanf("%d", &val) //输入链表节点的数据

pNew->data = val //把数据赋值给节点数据域

pTail->next = pNew //末尾节点指针指向下一个新节点

pNew->next = NULL//新节点指针指向为空

pTail = pNew //将新节点复制给末尾节点

}

printf("链表创建成功!")

return phead//返回头结点

}

void Trave(plist_node List)/*链表遍历函数*/

{

plist_node Pn = List->next

printf("遍历链表的值为:")

if( Pn == NULL)

printf("链表为空!")

while( Pn != NULL)

{

printf("%d \t",Pn->data)

Pn =Pn->next

}

printf("\n")

}

plist_node Find(plist_node List)/*链表查询函数*/

{

plist_node P = List->next

int num=0,val=0//num 为节点位置,val为查询到的值

printf("请输入要查询的值:")

scanf("%d",&val)

while(P!= NULL &&P->data!=val)

{

P=P->next

++num

}

if(P!=NULL)

printf("找到的节点为:%d",num+1)

else

printf("找不到该节点!")

printf("\n")

return P

}

void Inser(plist_node List,int pos,int val)//链表的插入 *** 作,在 pos 号节点处插入数据 val

{

int pin = 0

plist_node P = List

while(P != NULL &&pin <pos-1)

{

P = P->next

++pin

}

plist_node tmp = (plist_node)malloc(sizeof(list_node))//临时节点,用于存储要插入的数据

if( tmp == NULL)

{

printf("内存分配失败!")

exit(-1)

}

//开始插入节点

tmp->data = val

tmp->next = P->next

P->next = tmp

}

void Deletelist(plist_node List,int pos)/*链表元素删除函数*/

{//删除第pos个节点

int pin=0

plist_node tmp

plist_node P = List

while(P != NULL &&pin<pos-1)

{

P = P->next

++pin

}

tmp = P->next

P->next = tmp->next

P->next = tmp->next

free(tmp)

tmp=NULL

}

void UI(int num)

{

switch(num)

{

case 11:

system("cls")

printf("**********首页*********\n")

printf("\n\t*1.创建链表\n")

printf("\t*2.查看链表\n")

printf("\t*3.查询链表\n")

printf("\t*4.插入节点\n")

printf("\t*5.删除节点\n")

printf("\t*0.返回首页\n")

printf("\n**********首页*********\n")

break

case 1:

system("cls")

printf("****\t*****创建*********\n")

break

case 2:

system("cls")

printf("****\t*****查看*********\n")

break

case 3:

system("cls")

printf("****\t*****查找*********\n")

break

case 4:

system("cls")

printf("****\t*****插入*********\n")

break

case 5:

system("cls")

printf("****\t*****删除*********\n")

break

case 0:

system("cls")

printf("****\t**************\n")

break

default:

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指针*/

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存