数据结构作业

双向链表尾删

 双向链表的按位置插入

head.h

#ifndef __HEAD_H_
#define __HEAD_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datatype[20];
typedef struct Node
{
 union{
   int len;
   datatype data;
 };
  struct Node *next;
   struct Node *prev;
}*doublelink;
 doublelink create_head();
doublelink create_node();
void output(doublelink l);
int insert_head(doublelink l,datatype e);
int insert_rear(doublelink l,datatype e);
int delete_head(doublelink l);
int delete_rear(doublelink l);
int insert_pos(doublelink l,int pos,datatype e);

#endif

main.c

#include"head.h"
int main (int argc, const char *argv[])
{
	doublelink l=create_head();
	//头插
	int n;
	datatype e;
	printf("请输入你要输入的个数");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	  printf("请输入你要输入的值");
	  scanf("%s",e);
	  insert_head(l,e);
	}
	printf("头插后:");
	output(l);
    //尾插
    printf("请输入你要输入的个数");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	  printf("请输入你要输入的值");
	  scanf("%s",e);
	  insert_rear(l,e);
	}
	printf("尾插后:");
	output(l);
     //头删
	 printf("头删后:");
     delete_head(l);
	 output(l);
      //尾删
	  printf("尾删后");
	  delete_rear(l);
	  output(l);
	  //按位置插入
	   int pos;
	   printf("请输入你要插入的位置");
	   scanf("%d",&pos);
	   printf("请输入你要插入的数");
	   scanf("%s",e);
        insert_pos(l,pos,e);
		output(l);
	return 0;
}

text.c

#include"head.h"
/*
 * function:    创建双向链表头结点
 * @param [ in] 
 * @param [out] 
 * @return      成功返回地址失败返回NULL
 */
 doublelink create_head()
{
doublelink l=(doublelink)malloc(sizeof(struct Node));
  if(l==NULL)
   return NULL;
  l->len=0;
  l->next=NULL;
  l->prev=NULL;
  return l;
}
/*
 * function:    创建双向链表普通结点
 * @param [ in] 
 * @param [out] 
 * @return      成功返回地址失败返回NULL
 */
doublelink create_node()
{
doublelink p=(doublelink)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
strcpy(p->data,"");
p->next=NULL;
p->prev=NULL;
  return p;
}
/*
 * function:    双向链表的遍历
 * @param [ in] 
 * @param [out] 
 * @return 无返回     
 */
void output(doublelink l)
{
if(l==NULL||l->len==0)
{
	printf("遍历失败\n");
 return;
}
  puts("正向遍历");
  doublelink p=l;
  while(p->next!=NULL)
{
  p=p->next;
  printf("%s\t",p->data);
}
  puts("\n逆向遍历:");
   while(p->prev!=NULL)
{
   printf("%s\t",p->data);
    p=p->prev;
}
puts("");
}

/*
 * function:    头插
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0失败返回-1
 */
int insert_head(doublelink l,datatype e)
{
   if(l==NULL)
   {
	   printf("插入失败\n");
    return -1;
   }
    doublelink s=create_node();
       strcpy(s->data,e);
	   s->next=l->next;
	   s->prev=l;
	   if(l->next!=NULL)
	   {
	   l->next->prev=s;
	   }
	   l->next=s;
	   l->len++;
}
/*
 * function:    尾插
 * @param [ in] 链表
 * @param [out] 
 * @return      成功返回0失败返回-1
 */
int insert_rear(doublelink l,datatype e)
{
if(l==NULL)
{
printf("插入失败\n");
return -1;
}
doublelink p=l;
while(p->next!=NULL)
{
 p=p->next;
}
doublelink s=create_node();
if(s==NULL)
	return -1;
	strcpy(s->data,e);
	p->next=s;
	s->prev=p;
	l->len++;
}
/*
 * function:    头删
 * @param [ in] 链表
 * @param [out] 
 * @return      成功返回0失败返回-1
 */
int delete_head(doublelink l)
{
  if(l==NULL||l->len==0)
  {
   printf("删除失败\n");
   return -1;
  }
  doublelink q=l->next;
  l->next=q->next;
  if(q->next==NULL)
  {
     q->next->prev=l;
  }
  free(q);
  q=NULL;
  l->len--;
}
/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int delete_rear(doublelink l)
{
if(l==NULL||l->len==0)
{
printf("删除失败\n");
return -1;
}
 doublelink p=l->next;
  while(p->next!=NULL)
{
 p=p->next;
}
 p->prev->next=NULL; 
 free(p);
	p=NULL;
 l->len--;
}
/*
 * function:    按位置插入
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0失败返回-1
 */
int insert_pos(doublelink l,int pos,datatype e)
{
 if(l==NULL||pos<1||pos>l->len+1)
 {
  printf("插入失败\n");
 }
 doublelink p=l;
  for(int i=0;i<pos-1;i++)
  {
    p=p->next;
  }
  doublelink s=create_node();
  if(s==NULL)
  return -1;
 strcpy(s->data,e);
  s->next=p->next;
  s->prev=p;
  p->next->prev=s;
  p->next=s;
  l->len++;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值