C语言实现数据结构线性表之链表

来一个C语言版本链表完整操作

#include<stdio.h>

typedef  int  DataType; /*定义DataType为int类型*/
typedef  struct  linknode    /*单链表存储类型*/
{
   DataType   data; /*定义结点的数据域*/
   struct  linknode   *next; /*定义结点的指针域*/
} LinkList; 


LinkList  *InitList()
{   /*初始化链表函数*/
    LinkList  *head;
    head=(LinkList*)malloc(sizeof(LinkList)); /*动态分配一个结点空间*/
    head->next=NULL;
    return head;                    /*头结点L指针域为空,表示空链表*/
} 

void CreateListH(LinkList  *head,int n)
{   /*头插法建立链表函数*/
    LinkList  *s;
    int i;
    printf("请输入%d个整数:",n);
    for(i=0;i<n;i++)                    
    {  s=(LinkList *)malloc(sizeof(LinkList));/*生成新结点*/
       scanf("%d",&s->data); /*读入新结点的数据域*/
       s->next=head->next;       /*将新结点的指针域存放头结点的指针域*/
       head->next=s;              /*将新结点插入头结点之后*/
    }
    printf("建立链表操作成功!\n");
} 

void CreateListL(LinkList  *head,int n)
{  /*尾插法建立链表函数*/
   LinkList  *s,*last;
   int i;
   last=head; /*last始终指向尾结点,开始时指向头结点*/               
   printf("请输入%d个整数:",n);
   for(i=0;i<n;i++)
   {  s=(LinkList *) malloc(sizeof(LinkList));  /*生成新结点*/
      scanf("%d",&s->data);            /*读入新结点的数据域*/
      s->next=NULL;           /*将新结点的指针域为空*/
      last->next=s;           /*将新结点插入表尾*/
      last=s;                  /*将last指针指向表尾结点*/
   }
   printf("建立链表操作成功!\n");
}

int  LengthList(LinkList  *head)
{   /*求链表长度函数*/
	LinkList  *p=head->next;
	int j=0;
	while(p!=NULL)  /*当p不指向链表尾时*/
    {   p=p->next; 
        j++;         
    } 
    return  j;
} 

void Locate(LinkList  *head,DataType x)
{  /*在链表中查找值为x的元素位置*/
   int  j=1;                       /*计数器*/
   LinkList  *p;
   p=head->next;                     
   while(p!=NULL  &&  p->data!=x)  /*查找及定位*/
   {   p=p->next;
   	  j++;
   }
   if(p!=NULL)
       printf("在表的第%d位找到值为%d的结点!\n",j,x);
   else
       printf("未找到值为%d的结点!\n",x);
} 

void SearchList(LinkList *head,int i)
{  /*在链表中按位置查找元素*/
   LinkList  *p;
   int j=0;
   p=head;                          /*p指向链表的头结点*/
   if(i>LengthList(head))
       printf("位置错误,链表中没有该位置!");
   while(p->next!=NULL && j<i)
   {
       p=p->next;
       j++;
   }
   if(j==i)                     /*判断与给定的序号是否相等*/
       printf("在第%d位上的元素值为%d!\n",i,p->data);
} 

void InsList(LinkList  *head, int i, DataType x)
{  /*按位置插入元素函数*/
   int j=0;
   LinkList  *p,*s;
   p=head;    
   while(p->next!=NULL && j<i-1)  /*定位插入点*/
   {
       p=p->next;
       j++;
   }

   if(p!=NULL)        /*p不为空则将新结点插到p后*/
   {   
	   s=(LinkList *)malloc(sizeof(LinkList)); /*生成新结点s*/
        s->data=x;               /*将数据x放入新结点的数据域*/
        s->next=p->next;        /*将新结点s的指针域与p结点后面元素相连*/
        p->next=s;               /*将p与新结点s链接*/
        printf("插入元素成功!\n");
   }
   else
        printf("插入元素失败");
} 


void DelList(LinkList  *head,int i)
{  /*按位置删除链表中元素函数*/
   int j=0;
   DataType x;
   LinkList  *p=head,*s;
   while(p->next!=NULL && j<i-1)  /*定位插入点*/
   {
      p=p->next;
      j++;
   }
   if(p->next!=NULL && j==i-1)
   {
      s=p->next;                  /*q为要删除结点*/
      x=s->data;                  /*将要删除的数据放入指针变量x中*/
      p->next=s->next;           /*将p结点的指针域与q结点后面元素相连*/
      free(s);
      printf("删除第%d位上的元素%d成功!\n",i,x);
   }
   else
      printf("删除结点位置错误,删除失败!");
} 

void DispList(LinkList *head)
{  /*显示输出链表函数*/
   LinkList *p;
   p=head->next;         /*p指针指向链表第一个结点*/
   while(p!=NULL)        /*当p指针不为空时输出链表每个数据域值*/
   {
       printf("%5d",p->data);
       p=p->next;
   }
} 


int main(){
	// 声明头指针
	LinkList *head;
	head = InitList();
	//CreateListH(head,5);
	CreateListL(head,5);
	
	printf("当前链表长度位%d\n",LengthList(head));
	Locate(head,30);
	SearchList(head,3);
	InsList(head,3,25);
	printf("当前链表长度位%d\n",LengthList(head));
	SearchList(head,3);
	DispList(head);
	DelList(head,3);
	printf("当前链表长度位%d\n",LengthList(head));
	SearchList(head,3);
	DispList(head);

	return 0;
}




相关阅读:

数据结构
顺序表
链表
顺序栈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农NoError

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值