1. 程式人生 > >c語言--線性表的鏈式儲存

c語言--線性表的鏈式儲存

#include "stdio.h"
#include "malloc.h"
#define datatype int
#define   ERROR 0
#define OK  1
typedef int ElemType;
typedef struct node
{  
	datatype data;        //連結串列的資料域
   struct node *next;    //連結串列的指標域
} LNode,*LinkList;

LinkList  Creat_LinkList1( ) //頭插入法建立單鏈表演算法
{  
	LinkList head;
	LNode *s;
	head=(LinkList)malloc(sizeof(LNode));
	head->next=NULL;
	char flag='Y';
 
	while(flag=='Y'||flag=='y'){
		s=(LNode *)malloc(sizeof(LNode));
		printf("請輸入新節點資料:");
		scanf("%d",&s->data);
		s->next=head->next;
		head->next=s;
		getchar();
		printf("繼續輸入嗎?(Y/N):");
		scanf("%c",&flag);
	}
	return (head->next);
}

/*按序號查詢 Get_Linklist(L,i)
在單鏈表L中查詢第i個元素結點,找到返回其指標,否則返回空*/
LNode *Get_LinkList(LinkList L,int i)
{
	int j;
 LNode *p;
 p=L;
 j=0;
 while((p->next!=NULL)&&(j<i))
 {
	 p=p->next;
	 j++;
 }
 if(i==j)
	 return p;
 else
	 return NULL;
}
 

/*插入運算 Insert_LinkList(L,i,x)
在單鏈表L的第i個位置上插入值為x的元素*/
int  Insert_LinkList(LinkList  L, int i, datatype  x)     
{	

	int j=0;   
	LinkList p=L,s;  
	while(j<i-1&&p!=NULL)  
	{    
		j++;    
		p=p->next;    
}    
	if(p==NULL)     
   return false;  
  else    
  {    
	  s=(LNode *)malloc(sizeof(LNode));     
	  s->data=x;   
	  s->next=p->next;    
	  p->next=s;     
	  return true;  
  }
}

/*刪除運算:Del_LinkList(L,i)
刪除單鏈表L上的第i個數據結點*/
int  Del_LinkList(LinkList  L,int i)   
{	
	char e;
	int j=0;  
	LinkList p=L,q;   
	while(j<i-1&&p!=NULL)   
	{      
		j++;   
		p=p->next; 
   }    
	if(p==NULL)     
		return false;   
	else   
	{      
		q=p->next;    
		if(q==NULL)     
			return false;    
		e=q->data;     
		p->next=q->next;  
		free(q);     
		return true;    
}
}
void print(LinkList L)           //輸出單鏈表
{   LNode *p=L;
    while(p->next!=NULL)
	{ printf("%d\t",p->data);    //輸出表中非最後一個元素
      p=p->next; 
	}
    printf("%d\n",p->data);      //輸出表中最後一個元素    
}

void main()
{ 
	LinkList  H;
    int i,j,k;
	datatype x;
	do
    {  
	printf("\n\n\n\n");
    printf("\t\t\t 連結串列子系統\n");
	printf("\t\t*******************************\n");
	printf("\t\t*        1----建    表     *\n");
	printf("\t\t*        2----插    入    *\n");
	printf("\t\t*        3----刪  除    *\n");
	printf("\t\t*        4----查  找    *\n");
	printf("\t\t*        5----顯  示    *\n");
	printf("\t\t*        0----返  回    *\n");
	printf("\t\t*******************************\n");
	printf("\t\t 請選擇選單項(0-5):");
	scanf("%d",&k);getchar();
	if (k==1)
    	H=Creat_LinkList1( );      //用頭插入法建立單鏈表
	else if (k==2)       //線上性表第i位置處插入值為X的元素
	{
		printf("\n   請輸入插入的位置i和資料X(輸入格式:i,X):");
		scanf("%d,%d",&i,&x);
		j=Insert_LinkList(H,i,x);
	}
	else if (k==3)
	{	printf("\n   請輸入要刪除元素的位置i:");
		scanf("%d",&i);
		j=Del_LinkList(H,i);
		if (j == 1) printf("刪除成功!!");
		else printf("刪除失敗!!");		
	}
	else if (k==4)       //查詢線性表中元素值為x的位置
	{	printf("\n   請輸入要查詢的序號i:");
		scanf("%d",&i);
		LNode  *p;
		p=Get_LinkList(H,i);
		if (p!=NULL) 
		{ print(H);printf("中序號為i的地址是 %d ",p);}
		else
		printf("連結串列中無此序號!!\n");
	}
	 else if (k==5)        //輸出連結串列
	 {	printf("\n表的儲存順序為:");
        print(H);  
	}
	}while(k!=0);
}

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 說明:1.這個是鄙人大二期間所學,所以模板很多人都用過,如有雷同,不是偶然。 2.發部落格只為了紀念所學所感,於此而已。