1. 程式人生 > >資料結構與演算法——單鏈表(一)

資料結構與演算法——單鏈表(一)

單鏈表的頭插法,插入時就是逆序。 InsertList()還不完善。
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1

typedef  int Status ;
typedef int Elemtype ;
typedef struct Node{
	Elemtype data;//資料域
	struct Node *next;//指標域
}Node;
typedef struct Node*  LinkList;//LinkList為指向Node的指標。

/*
*函式宣告
*/
Status FrontInsertList(LinkList &L);
Status InsertList(LinkList &L,int i,Elemtype e);  
void PrintList(LinkList L); 

int main(){
	Elemtype e;
	int i;
	LinkList L;
	L=NULL; 
	if(FrontInsertList(L))
    PrintList(L);//列印單鏈表
	
	printf("請輸入要插入的元素和位置:\n");
	scanf("%d %d",&e,&i);
	if(InsertList(L, i,e))
	{
	printf("\n\n新的連結串列為:\n");
	PrintList(L);
	}
	return 0;
}
Status FrontInsertList(LinkList &L){//頭插法
	LinkList p,q;//輸入元素的新結點
	int n;
	q=(LinkList)malloc(sizeof(Node));
	q=NULL;
    printf("請輸入n和n個數據元素:\n");
	scanf("%d",&n);	
	 while(n--)
	 {
	  p=(LinkList)malloc(sizeof(Node));
	  p->next=q;
	  q=p;
	  scanf("%d",&p->data);//頭插法為逆值
	 } 
	
	 while(p->next)//遍歷到第一個結點
	 {
		 p=p->next;
	 }

	 L=q;	 
    printf("連結串列輸入結束(END)\n"); 
	 return OK;
}


/*
*****給連結串列的第i個位置插入**************
*/   
Status InsertList(LinkList &L,int i,Elemtype e)  
{  
    LinkList p,s;
    int j=1; 
	p=L;
    s=(LinkList)malloc(sizeof(Node));  

	while(p&&j<i)//尋找第i個節點,有一個為假退出,NUll時最後一個。
	{
	    p=p->next;
	    j++;
	}
	if(!p||j>i)//最後一個還沒有或者找不到
		return ERROR;
	s->data=e;
	s->next=p->next;
	p->next=s;

    return OK;
} 

/*
*****************列印連結串列***********************
*
**/  
void PrintList(LinkList L)
{  
	
    LinkList temp;  
	temp=L;                                                                  
    printf("\n連結串列存入的值為:\n");  
    while(temp!=NULL)      //非空表
    {  
        printf("%2d",temp->data);//輸出連結串列節點的值
        temp=temp->next; 
    }  
    printf("\n連結串列列印結束!!\n");  
}