代码改变世界

实现链表的初始化,按值查找,插入,删除

  只喝牛奶的杀手  阅读(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

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示