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

时间:2020-12-28 14:43:22

#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");
}