1. 程式人生 > >單鏈表的一些操作

單鏈表的一些操作

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node 
{
    ElemType data;               
    struct Node *next;          
}Node,*LinkedList;
LinkedList LinkedListInit() 
{
    Node *L;
    L = (Node *)malloc(sizeof(Node)); 
    if(L == NULL) { 
        printf("申請記憶體空間失敗\n");
    }
    L->next = NULL;                  
 	return L;
}
LinkedList LinkedListCreat_H() {//前插法 
    Node *L;
    L = (Node *)malloc(sizeof(Node));   
    L->next = NULL;                     
    ElemType x;                         
    while(scanf("%d",&x) != EOF ){
        Node *p;
        p = (Node *)malloc(sizeof(Node));    
        p->data = x;                      
        p->next = L->next;                    
        L->next = p; 
    }
    return L; 
} 
LinkedList LinkedListCreat_E()//後插法 
{
	Node *L,*r;
	L=(Node *)malloc(sizeof(Node));
	L->next=NULL;
	r=L; 
	ElemType x;
	while(scanf("%d",&x)!=EOF)
	{
		Node *p;
		p=(Node *)malloc(sizeof(Node));
		p->data=x;
		p->next=NULL;
		r->next=p;
		r=p; 
	}
	return L;
}
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) //插入 
{
    Node *pre;                     
    pre = L;
    int tempi = 0;
    for (tempi = 1; tempi < i; tempi++) {
    	pre = pre->next;                  
	}
    Node *p;                                
    p = (Node *)malloc(sizeof(Node));
    p->data = x; 
    p->next = pre->next;
    pre->next = p;
     
    return L;                           
} 

LinkedList LinkedListDelete(LinkedList L,ElemType x)//刪除 
{
    Node *p,*pre;                    
    p = L;
    while(p->data != x) {               
        pre = p; 
        p = p->next;
    }
    pre->next = p->next;          
    free(p);
    return L;
} 
LinkedList LinkedListLook(LinkedList L,ElemType x)//查詢 
{
	int q=0;
	Node *p,*pre;
	p=L;
	while(p->data!=x)
	{
		pre=p;
		p=p->next;
		q++;
	}
	printf("該資料在連結串列中的位置是第%d個!\n",q);
}
int main() 
{
    LinkedList list,start;
    int a;
    printf("1.前插法建立單鏈表\n");
    printf("2.後插法建立單鏈表\n");
    printf("請輸入:");
    scanf("%d",&a);
    if(a==1)
    {
    	printf("前插法:請輸入單鏈表的資料:"); 
    	list = LinkedListCreat_H();
    	for(start = list->next; start != NULL; start = start->next) 
		{
    		printf("%d ",start->data);
		}
    	printf("\n");
	}
 	else if(a==2)
 	{
 		printf("後插法:請輸入單鏈表的資料:");
		list = LinkedListCreat_E();
		for(start = list->next; start != NULL; start = start->next) 
		{
    		printf("%d ",start->data);
		}
		printf("\n");
	} 
    int i;
    ElemType x;
    printf("請輸入插入資料的位置:");
    scanf("%d",&i);
    printf("請輸入要插入的值:");
    scanf("%d",&x);
    LinkedListInsert(list,i,x);
    for(start=list->next;start!=NULL;start=start->next)
    {
    	printf("%d ",start->data);
	}
    printf("\n");
    printf("請輸入要刪除的元素的值:");
    scanf("%d",&x);
    LinkedListDelete(list,x); 
    for(start = list->next; start != NULL; start = start->next) {
    	printf("%d ",start->data);
	}
    printf("\n");
    printf("請輸入要查詢的資料:");
	scanf("%d",&x);
    LinkedListLook(list,x);
    return 0;
}