实现链表的初始化,按值查找,插入,删除
2015-09-14 09:03 只喝牛奶的杀手 阅读(581) 评论(0) 编辑 收藏 举报#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node * next;
}Node, *LinkList; void init_linklist(LinkList *l)/*对单链表进行初始化*/
{
*l=(LinkList)malloc(sizeof(Node));
(*l)->next=NULL;
}
void creatlianbiao(LinkList L)
{
Node *s;
char c;
int flag=1;
while(flag)
{
c=getchar();
if(c!='@')
{
s=(Node*)malloc(sizeof(Node)); //建立新节点
s->data=c;
s->next=L->next; //将s节点插入表头
L->next=s;
}
else flag=0;
}
}
Node *Search(LinkList L,ElemType e) // 按值查找
{
Node *p;
p=L->next;
while(p!=NULL)
{
if(p->data!=e)
{
p=p->next; // 指向下一个节点
}
else break;
}
return p;
}
int InsList(LinkList L,int i,ElemType e) // 在带头节点的单链表中第i个位置插入值为e的新节点
{
Node *pre,*s;
pre=L;
int k=0;
if(i<0)
return ERROR;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(!pre) // 相当于pre=null
{
printf("插入的位置不合法!");
return ERROR;
}
s=(Node*)malloc(sizeof(Node)); // 为e申请一个新的节点并由s指向它
s->data=e;
s->next=pre->next;
pre->next=s;
return OK;
}
int DelList(LinkList L,int i,ElemType *e )
{
Node *pre,*r;
int k=0;
pre=L;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(!(pre->next))
{
printf("删除的位置不合理!");
return ERROR;
}
r=pre->next;
pre->next=r->next;
*e=r->data;
free(r);
return OK;
}
void main()
{
LinkList l;
Node *p;
char c;
char *d;
init_linklist(&l);
printf("用头插法建立单链表,请输入链表数据,以@结束!\n");
creatlianbiao(l);
p=l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("请输入要查找的元素值:\n");
fflush(stdin); //清空输入缓冲区
scanf("%c",&c);
p = Search(l,c);
if(p!=NULL)
printf("该结点的值为:%c\n",p->data);
else
printf("未找到此结点!\n");
int flag=0;
int i;
printf("请输入插入的位置和元素:\n");
scanf("%d,%c",&i,&c);
flag=InsList(l, i, c);
if(flag)
printf("插入操作成功!\n");
else
printf("插入操作失败!\n");
p = l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n请输入被删元素的位置:");
scanf("%d",&i);
d= (char*)malloc(sizeof(char));
DelList(l,i,d);
printf("被删除的元素是:%c\n",*d);
p = l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
原csdn博客地址:http://blog.csdn.net/sha_520/article/details/7350727
欢迎大家关注微信号killerhub,微信公众号名称:只喝牛奶的杀手, 扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端