【数据结构与算法】单链表程序练习

原创 2018年04月17日 15:59:01
#include <stdio.h>
#define ERROR 0
#define OK 1 
#define ElemType int
typedef int status;
typedef struct Node
{
	ElemType data;
	struct Node* next;	
}Node;
typedef struct Node* Linklist;

/*遍历链表元素并打印*/ 
status VisitList(Linklist L)
{
   Linklist p;
   int j=0;
   p=(Linklist)malloc(sizeof(Node));
   p=L->next;
   while(p)
   {
   	 printf("%d ",p->data);
   	 p=p->next;
   	 j++;
   }	
   printf("链表长度为:%d\n",j);
   return OK;	
}
/*获取链表长度*/ 
int ListLength(Linklist L)
{
      Linklist p;
      //p=(Linklist)malloc(sizeof(Node));
	  int i=0;
	  p=L->next;
	  while(p)
	  {
  		   	 p=p->next;
   	         i++;
  	  }
  	  return i;  	
}
/*使用尾插法创建长度为n的链表*/ 
status CreateListTail(Linklist *L,int n)
{
	Linklist r,p;
	int j;
	*L=(Linklist)malloc(sizeof(Node));
	r=(Linklist)malloc(sizeof(Node));
	r=*L;
	srand(time(0));
	for(j=0;j<n;j++)
	{     
	    p=(Linklist)malloc(sizeof(Node));
	    p->data=rand()%100+1;
		r->next=p;
		r=p;
	}
	r->next=NULL;
    VisitList(*L);	
	return OK;
}
/*使用快慢指针法求得链表中间值*/ 
status ListlinkMid(Linklist L,ElemType *e)
{
	Linklist mid,search;
	mid=search=L;
	while((search->next)!=NULL)	
	{
		if((search->next->next)!=NULL)
		{
            search=search->next->next;
    		mid=mid->next;
    		
		}
		else
		{
			 search=search->next;
		}   
				
	}
	mid=mid->next;
	 *e=mid->data;
	return OK;
}
/*---获取链表第i个元素----*/
/*其中1<=i<=ListLength(L)*/  
status GetElem(Linklist L,int i,ElemType *e)
{
  Linklist p;
  int j=1;
  p=L->next;
  if((i<1)|| (i>ListLength(L)))
  {
   return ERROR;	
  }
  while(j<i)
  {
    p=p->next;
	j++;	
  }	
  *e=p->data;
  return OK;
}
/*---在链表第i个元素之前插入值e----*/
/*-----其中1<=i<=ListLength(L)----*/  
status ListInsert(Linklist *L,int i,ElemType e)
{
     Linklist p,s;
     p=*L;
	 int j;
	 if((i<1)||(i>ListLength(*L)))
	 {  
 		return ERROR;
 	 }	
     for(j=1;j<i;j++)
	    {
  	     p=p->next;           	
   	    }	  		
 	 s=(Linklist)malloc(sizeof(Node));
 	 s->data=e;
 	 s->next=p->next;
     p->next=s;
 	 return OK;
}
/*----------删除链表第i个元素------*/
/*-----其中1<=i<=ListLength(L)----*/ 
status ListDelete(Linklist *L,int i)
{
     Linklist p,q;
     p=*L;
	 int j;
	 if((i<1)||(i>ListLength(*L)))
	 {  
 		return ERROR;
 	 }	
     for(j=1;j<i;j++)
	    {
  	     p=p->next;           	
   	    }	  		
 	 q=p->next;
     p->next=q->next;
     free(q);
 	 return OK;
} 
/*------------链表整表删除---------*/
/*-----其中1<=i<=ListLength(L)----*/ 
status ClearList(Linklist *L)
{
     Linklist p,q;
     p=(*L)->next;
    while(p)
    { 
     	q=p->next;
     	free(p);
     	p=q; 	
     }
     (*L)->next = NULL ;
 	 return OK;
} 
int main()
 {	
     int x,n;
     ElemType e; 
	 Linklist L;
	 int CMR;
	 printf("请输入:\n");
     printf("1.查询链表:\n");
     printf("2.创建链表:\n");
     printf("3.查找中点:\n");
     printf("4.查找元素:\n");
     printf("5.插入元素:\n");
     printf("6.删除元素:\n");
     printf("7.删除链表:\n");
	 while(scanf("%d",&x)!=EOF){
	 switch(x)
    {
	 case 1: CMR=VisitList(L);
	         if(CMR)
         		 printf("OK\n");
         	 else
     	         printf("ERROR\n");
	         break;
	 case 2:CMR=CreateListTail(&L,9);
	         if(CMR)
	            {  
       		      printf("OK\n");
            	}
         	 else
     	         printf("ERROR\n");
             break;	
	 case 3: CMR=ListlinkMid(L,&e);
	         if(CMR)
	         {
         		printf("mid is:%d\n",e); 
          		printf("OK\n");
           	 }        		   		  	 
         	 else
     	         printf("ERROR\n");
	         break;	         
	  case 4: printf("请输入查找元素:");
              scanf("%d",&n);
	          CMR=GetElem(L,n,&e);
	          if(CMR)
	          {
         		printf("the %d number is:%d\n",n,e); 
          		printf("OK\n");
          	  }        		   		  	 
         	 else
     	         printf("ERROR\n");
	         break;  	
	  case 5:printf("请输入位置和元素:");	  
	         scanf("%d,%d",&n,&e);
			 CMR=ListInsert(&L,n,e); 
             if(CMR)
	         {  
	            VisitList(L);
          		printf("OK\n");
           	 }        		   		  	 
         	 else
 	            printf("ERROR\n");
	         break;  
	  case 6: printf("请输入删除元素:");
              scanf("%d",&n);
	          CMR=ListDelete(&L,n);
	          if(CMR)
	          {
         	    VisitList(L);
          		printf("OK\n");
          	  }        		   		  	 
         	 else
     	         printf("ERROR\n");
	         break;  
 	  case 7: CMR=ClearList(&L);
	         if(CMR)
                 printf("OK\n");	
           	 else
     	         printf("ERROR\n");
	         break;	  	  
     default:printf("输入有误\n");   
             break;
	}
	
	 }
	return 0;
 } 

                

数据结构第二次上机 第二章之单链表

实验题 2:实现单链表的各种基本运算的算法 2. 编写一个程序linklist.cpp,实现单链表的各种基本运算和整体建表运算(假设单链表的元素类型为char),并在此基础上设计一个程序exp2-2....
  • Haruno_Sakura
  • Haruno_Sakura
  • 2017-11-04 21:18:31
  • 147

数据结构之自建算法库——循环单链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时双链表。按照“0207将算法变程序”[视频]部分建议的方法,建设自己的专业基础设施算法库。双链表算法库算法库采用程序的多文件组织形式,包括两个...
  • sxhelijian
  • sxhelijian
  • 2015-09-12 06:55:51
  • 2112

数据结构-基本算法-单链表

  • 2017年05月21日 18:46
  • 5KB
  • 下载

数据结构之单链表实践练习

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)访问特定编号的节点则需要O(n)的时间,而...
  • qq_36812650
  • qq_36812650
  • 2017-11-16 19:06:57
  • 58

数据结构练习——简单单链表

头文件1:NodeStruct.h //为了防止重定义结构体 #ifndef _NODESTRUCT_H_ #define _NODESTRUCT_H_ #include //单向链表节点数据...
  • wochendaixin
  • wochendaixin
  • 2017-12-21 10:11:31
  • 71

数据结构与算法练习Java版练习1.4

package ch01; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException;...
  • zhangyingli
  • zhangyingli
  • 2015-08-28 13:49:03
  • 768

数据结构与算法(7)——单链表习题二

题目1:假设两个单向链表在某结点相交后,成为一个新的单向链表。两个链表的头结点是已知的,但是相交的结点未知。也就是说,它们相交之前的结点个数是未知的,并且两个链表的结点数也可能不同。假设链表List1...
  • u012187452
  • u012187452
  • 2017-03-28 09:29:13
  • 338

数据结构与算法——单链表的基本操作

下面的代码中包括获取某一结点的数据和增删操作#include #include typedef int status; typedef int ElemType; #define ERROR 0; #...
  • u011342403
  • u011342403
  • 2017-05-26 22:24:16
  • 300

C语言数据结构 单链表的删除算法

  • 2011年05月10日 16:06
  • 476B
  • 下载

数据结构和算法设计专题之---单链表的逆序

下面很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014-07-18 21:24:14
  • 4105
收藏助手
不良信息举报
您举报文章:【数据结构与算法】单链表程序练习
举报原因:
原因补充:

(最多只允许输入30个字)