#include "stdio.h"
#include "conio.h"
#define NULL 0
int i
typedef int elemtype
typedef struct linknode
{
elemtype data
struct linknode *next
}nodetype
nodetype *creat()
{
elemtype d
nodetype *h=NULL,*s,*t
int i=1
printf("建立一个单链表\n")
printf("请输入各个元素的值,以空格符隔开,默认输入0结束\n")
while(1)
{
scanf("%d",&d)
if(d==0) break
if(i==1)
{
h=(nodetype *)malloc(sizeof(nodetype))
h->data=dh->next=NULLt=h
}
else
{
s=(nodetype *)malloc(sizeof(nodetype))
s->data=ds->next=NULLt->next=st=s
}
i++
}
return h
}
int len(nodetype *h)
{
int i=0
nodetype *p=h
while(p!=NULL)
{
p=p->nexti++
}
return i
}
void disp(nodetype *h)
{
nodetype *p=h
printf("输出链表如下\n")
if(p==NULL) printf("表空\n")
while(p!=NULL)
{
printf("%4d",p->data)
p=p->next
}
printf("结束\n")
}
nodetype *findr (nodetype *h,int i)
{
nodetype *p=h
int j=1
if(i>len(h)||i<=0)
printf("你输入的参数不合键颂扮法,找的元素不存在\n")
else
{
while(p!=NULL&&j<i)
{
j++p=p->next
}
}
return p
}
nodetype *delt(nodetype *h,int i)
{
nodetype *p=h,*s
if(i==1)
{
h=h->nextfree(p)
}
else
{
p=findr(h,i-1)
if(p!=NULL&&p->next!=NULL)
{
s=p->next
p->next=s->next
free(s)
}else
printf("输入的值不正确稿灶\n")
}
printf("你修改后的链表值如如下输出\n")
disp(h)
return h
}
nodetype *ins(nodetype *h,int i,elemtype x)
{
nodetype *p,*s
s=(nodetype *)malloc(sizeof(nodetype))
s->data=x
s->next=NULL
if(i==0)
{
s->next=hh=s
}
else
{
p=findr(h,i)
if(p!=NULL)
{
s->next=p->next
p->next=s
}
else
printf("输入的值不合法\n")
}
printf("您插入后的链表如如下输出\n")
return h
}
main()
{
int i=0,x=0
nodetype *h
h=creat()
disp(h)
printf("请输入您需要插入的元素位置i和这个接点的樱培值x以逗号隔开:\n")
scanf("%d,%d",&i,&x)
h=ins(h,i,x)
disp(h)
printf("请输入需要删除的元素位值i\n")
scanf("%d",&i)
h=delt(h,i)
printf("请输入您需要查找的第i个接点值\n")
scanf("%d",&i)
h=findr(h,i)
if(h)
{
printf("您查找的元素存在!\n")
}
else
printf("您查找的元素不存在!\n")
system("pause")
}
这个程序实现了链表的:
建立
插入
查找
遍历输出
删除
5个功能。
#include<stdio.h>#include<stdlib.h>
typedef struct LNode
{
char data
struct LNode *next
}LNode,*LinkList
void InitList(LinkList *L) //初始化
{
*L = (LinkList)malloc(sizeof(LNode))
(*L)->next = NULL
}
char GetElem(LinkList L,int i) //返回i 位置的元素
{
//L为带头结点的单链表的头指针。
LinkList p
int j
p = L->nextj = 1//初始化,p指向第一个结点,j为计数器
while(p &&j<i)
{
p = p->next
++j
}
if(!p || j>i) exit(1) //i位置元素不存在
return(p->data)
}
void ListInsert(LinkList *L,int i,char e)//插入
{
//在带穗袜头结点的单链线性表L中第i个位置前插入元素e
LinkList p,s
int j
p = *Lj = 0
while(p &&j<i-1)//寻找第i-1个结点
{
p = p->next
++j
}
if(!p || j>i-1) exit(1)//i位置不正确
s = (LinkList)malloc(sizeof(LNode))//新结点
s->data = e
s->next = p->next
p->next = s
}
void ListDelete(LinkList *L,int i)//删除i位置元素
{
LinkList p,q
int j
p = *Lj = 0
while(p->next &&j<i-1)//寻找第i个结点
{//这以p->next开始是为了避开头结点,头结点不可删除
//而且这样是必须的,这样是为了有被删租空除点前面结点的地址,这样才能有前继结点,连接删猜型激除点的后继结点.
p = p->next
++j
}
if(!(p->next) || j>i-1) exit(1)//删除位置不合理
q = p->next //删除该点
p->next = q->next
free(q)
}
void CreateList(LinkList *L,int n)
{
//逆位序输入n个元素的值,建立带表头结点的单链线性表L
int i
LinkList p
(*L) = (LinkList)malloc(sizeof(LNode))
(*L)->next = NULL//先建立带头结点的单链表
for(i=ni>0--i)
{
p = (LinkList)malloc(sizeof(LNode))//生成新结点
scanf("%c",&p->data)
fflush(stdin)
p->next = (*L)->next
(*L)->next = p
}
//*****************另一插入法**************************
q = *L = (LinkList)malloc(sizeof(LNode))
(*L)->next = NULL
for(i=ni>0--i)
{
p = (LinkList)malloc(sizeof(LNode))
scanf("%c",&p->data)
fflush(stdin)
p->next = NULL
q->next = p
q = p
//q->next = p
}
//***********************************************************
}
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)
{
//链表La,Lb按递增排列
LinkList pa,pb,pc
pa = (*La)->next
pb = (*Lb)->next
(*Lc) = pc = (*La)
while(pa &&pb)
{
if(pa->data <= pb->data)
{
pc->next = pa
pc = pa
pa = pa->next
}
else
{
pc->next = pb
pc = pb
pb = pb->next
}
}
pc->next = pa?pa:pb//插入剩余段
//free(Lb) //释放Lb头结点
}
void display(LinkList *L)
{
LinkList di
di = (*L)->next
while(di!=NULL)
{
printf("%c\t",di->data)
di = di->next
}
printf("\n")
}
void main()
{
LinkList link,link2,link3
InitList(&link)
InitList(&link2)
CreateList(&link,5)
CreateList(&link2,5)
display(&link)
display(&link2)
MergeList(&link,&link2,&link3)
display(&link3)
}
里面不包括查找,查找的可以用二分查找等等,不想太麻烦就直接用顺序查找吧.
有个以前练习写的。//利用单链表编写一个学生成绩系统。(具有查询成绩、修改成绩、删除成绩、添加成绩、全班平均等功能。)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
typedef char nametype
typedef float gradetype
typedef struct node{
nametype name[MAXSIZE]
gradetype grade
struct node *next
}linklist,*plinklist
plinklist init(){
plinklist L
L=(plinklist)malloc(sizeof(linklist))
L->next =NULL
return L
}
plinklist creat_tail(plinklist L){
plinklist s
printf("name &grade:")
s=(plinklist)malloc(sizeof(linklist))
scanf("%s%f",s->name,&s->grade)
s->next=L->next
L->next=s
return L
}
plinklist locate_name(plinklist L,nametype x[]){
plinklist p
p=L
while(p->next!=NULL){
p=p->next
if(strcmp(p->name,x)==0)return p
}
return NULL
}
int delete_list(plinklist L,plinklist p){
plinklist q=L
while(q->next!=NULL){
if(q->next ==p) break
q=q->next
}
if(q->next ==p){
q->next =p->next
free(p)
return 1
}
else{
printf("不在尺贺该表中\n")
return 0
}
}
/*********平均分数***********/
void average(plinklist L){
float i
float sum=0.0
plinklist p=L
for(i=0p->next!=NULLi++){
p=p->next
sum=sum+p->伏谈grade
}
printf("%.2f\n",sum/i)
}
/*******添加成绩*************/
void insert_linklist(plinklist L){
L=creat_tail(L)
putchar(10)
printf("insert succeed\n")
}
/**********成绩查找**********/
void locate(plinklist L){
nametype name[MAXSIZE]
plinklist p
printf("name search:")
scanf("%s",name)
putchar(10)
p=locate_name(L,name)
printf("%s %.2f\n",p->name,p->grade)
}
/**********修改成绩**************/
void Amendment(plinklist L){
nametype name[MAXSIZE]
plinklist p
printf("name:")
scanf("%s",name)
putchar(10)
p=locate_name(L,name)
printf("输入修改信息,姓名缺困碰与分数:")
scanf("%s%f",p->name,&p->grade)
printf("\nAmendment succeed\n")
}
/**********删除成绩*********/
void del(plinklist L){
nametype name[MAXSIZE]
plinklist p
printf("name delete:")
scanf("%s",name)
putchar(10)
p=locate_name(L,name)
if(delete_list(L,p))
printf("delete succeed\n")
}
main()
{
int n,i
/******创建学生信息*********/
plinklist H
H=init()
printf("输入学生数量")
scanf("%d",&n)
for(i=0i<ni++)
H=creat_tail(H)
putchar(10)
printf("*****成绩查询*****\n")
locate(H)
printf("****修改成绩*****\n")
Amendment(H)
printf("****删除成绩*****\n")
del(H)
printf("****添加成绩*****\n")
insert_linklist(H)
printf("****全班平均*****\n")
average(H)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)