C语言: 链表查询
有一个数字连成的链表,初始为空有以下三个操作:rema删除a节点如果节点a不存在,不做任何操作如果节点a存在多个,删除第一个insab在节点a后面插入节点b如果节点a不存...
有一个数字连成的链表,初始为空
有以下三个操作:
rem a 删除a节点
如果节点a不存在,不做任何操作
如果节点a存在多个,删除第一个
ins a b 在节点a后面插入节点b
如果节点a不存在,插入到链表尾部
如果节点a存在多个,插入到第一个节点后面
que a 给出第1+(a%len)个节点的数字, len是链表总长度
如果链表为空,不做任何操作
第一个输入的数表示后面有几个操作,如:
5
ins 1 2
ins 2 3
ins 2 1
rem 3
que 1
如果操作是que,输出结果,则上面操作会输出:
1
要代码哦~~ 展开
有以下三个操作:
rem a 删除a节点
如果节点a不存在,不做任何操作
如果节点a存在多个,删除第一个
ins a b 在节点a后面插入节点b
如果节点a不存在,插入到链表尾部
如果节点a存在多个,插入到第一个节点后面
que a 给出第1+(a%len)个节点的数字, len是链表总长度
如果链表为空,不做任何操作
第一个输入的数表示后面有几个操作,如:
5
ins 1 2
ins 2 3
ins 2 1
rem 3
que 1
如果操作是que,输出结果,则上面操作会输出:
1
要代码哦~~ 展开
5个回答
展开全部
/*
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=0;i<len;i++)
{
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;
}
}
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=0;i<len;i++)
{
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;
}
}
展开全部
struct human
{
char sex[5];
char name[10];
int age;
struct human *next
}
首先如果已经建好链表的话,就会有一个头指针,假设是 head
那么 我只写一部分代码了,相信你学到链表的话其他部分应该不会难倒你
int i;
char s[10]; //假设使用姓名来查找
printf("input a name");
gets(s); //输入要查找的人的姓名
struct human *p//不能直接对头指针进行操作,要不然整个链表就没了
for(p=head;p!=NULL;p=p->next) //遍历的思想
{
i=strcmp(p->sex,"man"); //比较两个字符串 当sex 为"man" 时,i=0
if(i==0)
j=strcmp(p->name,s);
if(j==0)
{
printf("%s\n%s\n%d\n",p->name,p->name,p->age);
/*输出所有信息,当然如果你的链表信息比较多点的话,会麻烦点,也可以用多个printf*/
break; //结束查找
}
}
//当然,如果你想查找多个人的话可以多一个循环 如下
char c='y';
while(c!='n')
{
for(p=head;p!=NULL;p=p->next) //遍历的思想
{
i=strcmp(p->sex,"man");
/*比较两个字符串 当sex 为"man" 时,i=0,
记得最开头要include<string.h>,要不然无法用strcmp函数*/
if(i==0)
j=strcmp(p->name,s);
if(j==0)
{
printf("%s\n%s\n%d\n",p->name,p->name,p->age);
/*输出所有信息,当然如果你的链表信息比较多点的话,会麻烦点,也可以用多个printf*/
break; //结束查找
}
}
printf("input y to conitue search or n to end\n"); // 提示是否查找另一个人;
scanf("%c",&c);
}
{
char sex[5];
char name[10];
int age;
struct human *next
}
首先如果已经建好链表的话,就会有一个头指针,假设是 head
那么 我只写一部分代码了,相信你学到链表的话其他部分应该不会难倒你
int i;
char s[10]; //假设使用姓名来查找
printf("input a name");
gets(s); //输入要查找的人的姓名
struct human *p//不能直接对头指针进行操作,要不然整个链表就没了
for(p=head;p!=NULL;p=p->next) //遍历的思想
{
i=strcmp(p->sex,"man"); //比较两个字符串 当sex 为"man" 时,i=0
if(i==0)
j=strcmp(p->name,s);
if(j==0)
{
printf("%s\n%s\n%d\n",p->name,p->name,p->age);
/*输出所有信息,当然如果你的链表信息比较多点的话,会麻烦点,也可以用多个printf*/
break; //结束查找
}
}
//当然,如果你想查找多个人的话可以多一个循环 如下
char c='y';
while(c!='n')
{
for(p=head;p!=NULL;p=p->next) //遍历的思想
{
i=strcmp(p->sex,"man");
/*比较两个字符串 当sex 为"man" 时,i=0,
记得最开头要include<string.h>,要不然无法用strcmp函数*/
if(i==0)
j=strcmp(p->name,s);
if(j==0)
{
printf("%s\n%s\n%d\n",p->name,p->name,p->age);
/*输出所有信息,当然如果你的链表信息比较多点的话,会麻烦点,也可以用多个printf*/
break; //结束查找
}
}
printf("input y to conitue search or n to end\n"); // 提示是否查找另一个人;
scanf("%c",&c);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//下面是我的代码,我新加了一个显示链表中的数据的功能,只要输入show就行,这样方便查看。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{
int num;
node *next;
}number;
int len;
void Rem(number *head)
{
number *p=head;
int num;
scanf("%d",&num);
while(p->next != NULL)
{
if(p->next->num==num)
break;
p=p->next;
}
if(p->next!=NULL)
{
p->next=p->next->next;
--len;
}
}
void Ins(number *head)
{
number *p=head;
int n1,n2;
scanf("%d %d",&n1,&n2);
while(p->next != NULL)
{
p=p->next;
if(p->num==n1)
break;
}
number *q=(number *)malloc(sizeof(number));
q->num=n2;
q->next=p->next;
p->next=q;
++len;
}
void Que(number *head)
{
number *p=head;
int n,i=0;
scanf("%d",&n);
if(len==0)
return;
n=1+(n%len);
while(p->next != NULL)
{
++i;
if(i==n)
{
printf("%d\n",p->next->num);
break;
}
p=p->next;
}
}
void Show(number *head)
{
number *p=head;
p=p->next;
if(p!=NULL)
printf("%d",p->num);
while(p->next!=NULL)
{
printf("\t%d",p->next->num);
p=p->next;
}
printf("\n");
}
void main()
{
number *head=(number *)malloc(sizeof(number));
head->next=NULL;
char order[10];
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",order);
if(strcmp(order,"rem")==0)
Rem(head);
else if(strcmp(order,"ins")==0)
Ins(head);
else if(strcmp(order,"que")==0)
Que(head);
else if(strcmp(order,"show")==0)
Show(head);
else
{
printf("命令格式错误,请重新输入!\n");
++n;
}
}
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{
int num;
node *next;
}number;
int len;
void Rem(number *head)
{
number *p=head;
int num;
scanf("%d",&num);
while(p->next != NULL)
{
if(p->next->num==num)
break;
p=p->next;
}
if(p->next!=NULL)
{
p->next=p->next->next;
--len;
}
}
void Ins(number *head)
{
number *p=head;
int n1,n2;
scanf("%d %d",&n1,&n2);
while(p->next != NULL)
{
p=p->next;
if(p->num==n1)
break;
}
number *q=(number *)malloc(sizeof(number));
q->num=n2;
q->next=p->next;
p->next=q;
++len;
}
void Que(number *head)
{
number *p=head;
int n,i=0;
scanf("%d",&n);
if(len==0)
return;
n=1+(n%len);
while(p->next != NULL)
{
++i;
if(i==n)
{
printf("%d\n",p->next->num);
break;
}
p=p->next;
}
}
void Show(number *head)
{
number *p=head;
p=p->next;
if(p!=NULL)
printf("%d",p->num);
while(p->next!=NULL)
{
printf("\t%d",p->next->num);
p=p->next;
}
printf("\n");
}
void main()
{
number *head=(number *)malloc(sizeof(number));
head->next=NULL;
char order[10];
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",order);
if(strcmp(order,"rem")==0)
Rem(head);
else if(strcmp(order,"ins")==0)
Ins(head);
else if(strcmp(order,"que")==0)
Que(head);
else if(strcmp(order,"show")==0)
Show(head);
else
{
printf("命令格式错误,请重新输入!\n");
++n;
}
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
//---查找元素------------
linklist *mindata(linklist *head, datatype a)
{
linklist *p;
p = head->next;
while( p != NULL && p->data != a)
p = p->next;
}
return p ;
}
//------主函数---------------------
main()
{
linklist *head;
......
getchar();
} // main
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c语言链表操作帮实现
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询