问题9:编程实现一个单链表的建立/测长/打印以及结点的删除。

此题为一基本的数据结构方面的题目,主要考查单链表。

代码如下:

/**
 *  功能:单链表创建、测长打印
 *  作者:ahnselina
 */

#include <stdio.h>

typedef struct student
{
  int data;
  struct student *next;
}node;

//建立单链表
node *creat()
{
   node *head, *p, *s;
   int x, cycle = 1;
   //建立头结点
   head = (node*)malloc(sizeof(node));
   p = head;
   while(cycle)
   {
      printf("\nplease enter the data: ");
	  scanf("%d", &x);
	  if(x != 0)
	  {
	     //新建一个结点
	     s = (node*)malloc(sizeof(node));
		 s->data = x;
		 printf("\n    %d",  s->data);
		 p->next = s;
		 p = s;
	  } 
	  else
	     cycle = 0;
   }
   head = head -> next;
   p->next = NULL;
   printf("\n链表第一个结点值为:    %d", head->data);
   return head;
}

//单链表测长
int length(node *head)
{
   int len = 0;
   node *p = head;
   while(p != NULL)
   { 
      len++;
	 p = p->next;
   }
   return len;
}

//单链表打印
void print(node *head)
{
  node *p = head;
  int n = length(head);
  printf("\nNow, These %d records are:\n", n);
  while(p != NULL)
  {
     printf("\n     uuu  %d    ", p->data);
	 p = p->next;
  }
}

int main(void)
{
  printf("===========NOW CREAT A LIST=========\n");
  node *p = creat();
  printf("\n下面计算链表长度:");
  int len = length(p);
  printf("\n链表长度为: %d", len);
  printf("\n下面打印该单链表:");
  print(p);
  return 0;
}


程序运行结果:


加入结点删除后的代码如下:

/**
 *  功能:单链表创建、测长打印
 *  作者:ahnselina
 */

#include <stdio.h>

typedef struct student
{
  int data;
  struct student *next;
}node;

//建立单链表
node *creat()
{
   node *head, *p, *s;
   int x, cycle = 1;
   //建立头结点
   head = (node*)malloc(sizeof(node));
   p = head;
   while(cycle)
   {
      printf("\nplease enter the data: ");
	  scanf("%d", &x);
	  if(x != 0)
	  {
	     //新建一个结点
	     s = (node*)malloc(sizeof(node));
		 s->data = x;
		 printf("\n    %d",  s->data);
		 p->next = s;
		 p = s;
	  } 
	  else
	     cycle = 0;
   }
   head = head -> next;
   p->next = NULL;
   printf("\n链表第一个结点值为:    %d", head->data);
   return head;
}

//单链表测长
int length(node *head)
{
   int len = 0;
   node *p = head;
   while(p != NULL)
   { 
      len++;
	 p = p->next;
   }
   return len;
}

//单链表打印
void print(node *head)
{
  node *p = head;
  int n = length(head);
  printf("\nNow, These %d records are:\n", n);
  while(p != NULL)
  {
     printf("\n     uuu  %d    ", p->data);
	 p = p->next;
  }
}

//删除单链表一个结点
node *del(node *head, int num)
{
  node *p1, *p2;
  p1 = head;
  while(num != p1->data && p1->next != NULL)
  {
     p2 = p1;
	 p1 = p1->next;
  }
  if(num == p1->data)
  {
     if(p1 == head)
	 {
    	head = p1->next;
		free(p1);
	 }
	 else
	 {
   	    p2->next = p1->next;
		free(p1);
	 }
  }
  else
      printf("\n %d不存在", num);
  return head;
}


int main(void)
{
  printf("===========NOW CREAT A LIST=========\n");
  node *p = creat();
  printf("\n下面计算链表长度:");
  int len = length(p);
  printf("\n链表长度为: %d", len);
  printf("\n下面打印该单链表:");
  print(p);
  node *q = del(p, 4);
  printf("\n删除结点后的链表为:\n");
  print(q);
  return 0;
}
运行结果:



PS:在我最开始的程序里面,编译的时候出现错误

error: stray '\243' in program

这是因为有非标ascII的字符,字符一般都是全角符号什么的比如{ } 和{} ,和,

注意切换下输入法就好了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值