链表的基本使用

#include "stdio.h"/*单链表方式的实现*/
#include "malloc.h"
typedef char ElemType ;
typedef struct LNode/*定义链表结点类型*/
{
 ElemType data ;
 struct LNode *next;
}LNode,*LinkList;/*注意与前面定义方式的异同 */


/*建立链表,输入元素,头插法建立带头结点的单链表(逆序),输入0结束*/
LinkList CreateList_L(LinkList head)
{
 ElemType temp;
 LinkList p;
 printf("请输入结点值(输入0结束)");
 fflush(stdin);
 scanf("%c",&temp);
 while(temp!='0')
 {
  if(('A'<=temp&&temp<='Z')||('a'<=temp&&temp<='z'))
  {
   p=(LinkList)malloc(sizeof(LNode));/*生成新的结点*/
   p->data=temp;
   p->next=head->next;
   head->next=p;/*在链表头部插入结点,即头插法*/
  }
  printf("请输入结点值(输入0结束):");
  fflush(stdin);
  scanf("%c",&temp);
 }
 return head;
} 

/*顺序输出链表的内容*/
void ListPint_L(LinkList head)
{
 LinkList p;
 int i=0;
 p=head->next;
 while(p!=NULL)
 {
  i++;
  printf("单链表第%d个元素是:",i);
  printf("%c\n",p->data);
  p=p->next;
 }
} 

/*在带头链表结点的单链表中第i(从1开始)个位置之后插入元素*/
int LinkInsert_L(LinkList head,int i,ElemType e)
{
 LinkList p=head;
 LinkList s;
 int j;
 p=p->next;
 for(j=1;j<i-1;j++)
 {
  if(p)p=p->next;
  else break;
 }
 if(!p||i<1)
 {
  printf("error!!请输入正确的i的值!!");
  return 0;
 }
 s=(LinkList)malloc(sizeof(LNode));
 s->data=e;
 s->next=p->next;/*在当前结点p之后插入结点s*/
 p->next=s;
 return 1;
} 

/*在带头结点的单链表中删除第i(从1开始)个位置的元素 */
int ListDel_L(LinkList head,int i)
{
 LinkList p,tmp;
 int j;
 p=head->next;
 tmp=head;  for(j=1;j<i;j++)/*此for循环来使p指向第i个元素,temp指向第i-1个元素*/
 {
  if(p)
  {
   p=p->next;
   tmp=tmp->next;
  }
  else break;
 }  if(!p||i<1)
 {
  printf("error!!请输入正确的i值!!");
  return 0;
 }
 tmp->next=p->next;
 free(p);
 return 1;
}
void main()
{
 int i ;
 char cmd,e;
 LinkList head;
 head=(LinkList)malloc(sizeof(LNode));
 head->next=NULL;
 CreateList_L(head);
 ListPint_L(head);
 do
 {
  printf("i,I……插入");
  printf("d,D……删除");
  printf("q,Q……退出");
  do
  {
   fflush(stdin);
   scanf("%c",&cmd);
  }while((cmd!='d')&&(cmd!='D')&&(cmd!='i')&&(cmd!='I')&&(cmd!='q')&&(cmd!='Q'));
  switch(cmd)
  {
   case 'i':
   case 'I':
    printf("请输入您要插入的数据:");
    fflush(stdin);
    scanf("%c",&e);
    printf("请输入您要插入的位置:");
    scanf("%d",&i);
    LinkInsert_L(head,i,e);
    ListPint_L(head);
    break;
   case 'd':
   case 'D':
    printf("请输入您要删除的位置:");
    fflush(stdin);
    scanf("%d",&i);
    ListDel_L(head,i);
    ListPint_L(head);
    break;
  }
 }while((cmd!='q')&&(cmd!='Q'));
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值