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指针*/
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)