1. 程式人生 > >資料結構--C語言--逆序建立單鏈表,遍歷單鏈表,在單鏈表第5個元素前插入一個值為999的元素,刪除單鏈表第5個元素

資料結構--C語言--逆序建立單鏈表,遍歷單鏈表,在單鏈表第5個元素前插入一個值為999的元素,刪除單鏈表第5個元素

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define LEN sizeof(struct LNode)
struct LNode{
	int data;
	struct LNode *next;
};
typedef struct LNode LNode,* LinkList;

//初始化
LinkList InitLNode(void){
	LinkList head = (LinkList)malloc(LEN);
	if(!head){
		printf("儲存空間分配失敗!\n");
		exit(ERROR); 
	}
	head->data = 0;
	head->next = NULL;
	return head;
} 
//逆序建立單鏈表
int transCreat(LinkList head){
	LinkList pnew;
	pnew = (LinkList)malloc(LEN);
	printf("請依次輸入資料(輸入-1認為輸入終止)\n");
	scanf("%d",&pnew->data);
	while(pnew->data!=-1){//先把後邊的串上再串前邊的 
		head->data++;
		pnew->next = head->next;//核心語句 
		head->next = pnew;      //核心語句 
		pnew = (LinkList)malloc(LEN);
		scanf("%d",&pnew->data);
	}
	free(pnew);//此時的pnew資料域裡存放著-1 沒有被鏈入到連結串列中 無用 
	return OK; 
}
//輸出單鏈表
int printLNode(LinkList head){
	if(!head->next){
		printf("空連結串列!\n");
		return ERROR;
	}	
	LinkList p;
	p = head->next;
	do{
		printf("%d ",p->data);
		p = p->next	;
	}while(p);
}
//插入
int insertLNode(LinkList head,int num,int locate){
	if(locate<1||locate>head->data+1){
		printf("插入位置有誤!\n");
		exit(ERROR);
	}
	LinkList pnew,p;
	int i=0;
	p = head;//p指向第0個結點 i也表示第0個結點 
	pnew = (LinkList)malloc(LEN);
	pnew->data = num;
	while(p&&i<locate-1){//p的位置停在所要插入位置的前一位 
		p = p->next;
		i++;//p往後移動 i作為一個位置遊標就加1 
	}
	pnew->next = p->next;
	p->next = pnew;
	head->data++;
	return OK;
}
//刪除 
int delLinkList(LinkList head,int locate){
	if(!head->next){
		printf("空連結串列!\n");
		exit(ERROR); 
	}
	if(locate<1||locate>head->data){
		printf("位置有誤!\n");
		return ERROR; 
	}
	LinkList pleft,pright;
	int i = 0;
	pleft = pright = head;
	while(pright&&i<locate){
		pleft = pright;
		pright = pright->next;
		i++;//pright和i指的是同一個結點 
	}
	pleft->next = pright->next;
	head->data--; 
	free(pright);
	return OK; 
}

main(){
	LinkList head;
	head = InitLNode();
	transCreat(head);
	printLNode(head);
	printf("\n\n在單鏈表第5個元素前插入一個值為999的元素後結果是:\n"); 
	insertLNode(head,999,5);
	printLNode(head);
	printf("\n\n刪除單鏈表第5個元素後結果是:\n");
	delLinkList(head,5);
	printLNode(head);
}