求C语言大神,求编一个程序,建立链表,添加,删除,输出,查询;并对有序链表进行删除,查询,更新,急!

求C语言大神,求编一个程序,建立链表,添加,删除,输出,查询;并对有序链表进行删除,查询,更新,急!,第1张

#include "stdlib.h"

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

}


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

原文地址: http://outofmemory.cn/bake/11973109.html

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

发表评论

登录后才能评论

评论列表(0条)

保存