C語言單向不循環鏈表

按照課本敲了一遍代碼,但是整個程序有很多bug運行不起來。

僅做參考

#include <stdio.h>
#include <stdlib.h> 
/*定義結點的結構體*/
typedef int datatype;
typedef struct linknode{
	datatype data;//數據域,用來存放數據
	struct linknode * next;//指針域 
}LinkNode,*LinkList;//定義結點類型爲LinkNode,結點指針類型爲LinkList 

/*/*建立線性鏈表,這是在鏈表的頭部插入,
所以讀入數據的順序和線性表中的邏輯順序是相反的
	LinkNode *CreateLinkList(){
	LinkNode *head,*p,*s;
	int x;
	int z=1,n=0;//n用來記錄表長
	head =NULL;//初始化頭指針爲空
	printf("\t建立一個線性鏈表\n");
	printf("\t說明:請逐個輸入整數,輸入“-1”爲結束\n");
	while (z){
		printf("\t\t輸入:");
		scanf("%d",&x);
		if(x!=-1){
			s=(LinkNode*)malloc(sizeof(LinkNode));
			n++;//表長+1
			s->data=x;
			s->next=head;
			head=s;//每次循環用頭結點來代替當前結點,然後在當前結點前面插入結點。 
		}
		else z=0;
	}
	return head;
}*/
/*在鏈表的尾部插入數據,使其順序結構與邏輯結構相同*/
LinkNode *CreateLinkList(){
	LinkNode *head,*p,*s;//頭指針,尾指針,新結點 
	int x=0;//輸入的數據
	int z=1,n=0;//n用來儲存表長
	head->next=NULL;//頭結點爲空
	p=head;//空表時,尾指針指向頭結點
	printf("建立一個線性鏈表。");
	printf("請逐個輸入元素數據,結束標記爲-1\n");
	while(x!=-1){
		printf("請輸入第%d個元素:",z);
		z++;
		scanf("%d",&x);
		//創建一個新的結點
		s = (LinkNode *)malloc(sizeof(LinkNode));
		s->data = x;
		p->next = s;
		s->next = NULL;
	}
	
/*	while(z){
		printf("輸入:");
		scanf("&d",x);
		if(x!=-1){
			s=(LinkNode*)malloc(sizeof(LinkNode));
			s->data = x;
			s->next=NULL;
			if(!head){
				head = s;
			}
			else{
				p->next = s;
			}
			p=s;
			n++;
		}
		else z = 0 ;
	}*/ 
	return head;
}
/*求表長算法,
思路設一個移動指針p和計數器n,初始化後,p所指結點後面若還有結點,p向後移動,計數器+1*/
/*設L是帶頭結點的鏈表,(線性表的長度不包括頭結點)*/
int LenList1(LinkList L){
	LinkNode *p=L;//p指向頭結點
	int n=0;
	while(p->next!=NULL){
		p=p->next;
		n++;
	} 
	return n;
}
/*L是不帶頭結點的鏈表*/
int LenList2(LinkList L){
	LinkNode *p=L;
	int n=0; 
	if(p==NULL) return 0;//空表的情況下
	n=1;                //非空表的情況下,p所指的是第一個結點
	while(p->next!=NULL){
		p=p->next;
		n++;
	} 
	return n;
} 
/*按序號查找SearchList(L,i)
從鏈表的第一個元素結點開始,判斷當前結點是否是第i個,
是,則返回該結點的指針,否則繼續下一個,知道鏈表結束。
若沒有第i個結點則返回爲空*/
LinkNode *SearchList1(LinkList L,int i){
//在帶頭結點的線性鏈表L中查找第i個元素結點,找到後返回其指針,否則返回空
 	LinkNode *p = L;
 	int j = 0;
 	while(p->next!=NULL&&j<i){
 		p=p->next;
	 	j++;
	 }
	 if(j==i) return p;
	 else return NULL;
}
/*按值查找SearchList2(L,x)
從鏈表的第一個元素結點開始判斷當前接待你的值是否等於x,
若是,返回該節點的指針,否則繼續判斷下一個,直到鏈表結束
若找不到,則返回空*/
LinkNode *SearchList2(LinkList L,datatype x){
	LinkNode *p = L->next;
	while(p!=NULL&&p->data!=x) p = p->next;
	if(p->data == x)return p;
	else return NULL;
}

/*插入結點,設p指向線性鏈表中的某一個結點,s指向待插入的結點 
後插操作:①s->next = p->next 
	  ②p->next = s 兩條語句的順序不能交換
前插操作:與後插不投的是:首先要找到*p的前驅*q
然後再完成*q之後插入*s,設線性鏈表頭指針爲L操作如下
     q=L;
	 while(q->next!=p) q = q->next;
	 s->next = q->next;
	 q->next = s;*/
/*插入算法的算法思路
1,找到第一個節點,若不存在則結束,若存在則繼續下一步。
2,申請一個新節點,並複製。
3,將新節點插入*/
void InsertList(LinkList head,int i,datatype x){
	LinkNode *s,*p;
	p= head;
	int j = 0;
	while(p!=NULL&&j<i){//找到插入位置 
		j++;
		p=p->next;//後移指針 
	}
	if(p!=NULL){
		s=(LinkNode*)malloc(sizeof(LinkNode));
		s->data=x;//插入結點
		s->next = p->next;//修改指針
		p->next = s;
	/*	n++ ;//表的長度+1 ,需在結構體中添加n即鏈表的長度*/ 
	}
	else printf("\t線性表爲空或插入位置查出\n"); 
} 
/*刪除結點
要刪除節點q,首先要找到結點q的前驅結點p,
然後移動指針,釋放內存就可以了*/
LinkNode* DeleteList(LinkNode* head,datatype x){//head爲頭指針,x爲待刪除結點的值
//刪除不帶頭結點的單鏈表中結點x,返回刪除指定結點後的單鏈表頭指針
 	LinkNode *p,*q;
	 if(head ==NULL){
	 	printf("\t單鏈表爲空!\n");
	 	return head;
	 } 
	 if(head->next==NULL){
	 	if(head->data!=x){//只有一個結點,並且不是待刪結點
		 printf("\t未找到待刪除的結點!");
		 return head; 
		 } 
		 else{			//	只有一個結點,並且是待刪結點 
			delete head;//釋放被刪除結點的空間 
			return NULL;
		 }
	 }
	 q=head;
	 p=head->next;
	 while(p!=NULL&&p->data!=x){//查找待刪除的結點 
	 	q=p;
	 	p=p->next;
	 }
	 if(p!=NULL){
	 	q->next=p->next;
	 	delete p;
	 /*	n--;需在鏈表的結構體中添加n即鏈表的長度*/
	 	printf("\t%d已經被刪除",x); 
	 } else{
	 	printf("\t未找到待刪除的結點!\n");
	 }//這是刪除不帶頭結點的鏈表的元素的算法,寫出一個帶頭結點的刪除算法 
 
} 
 
int main(){
	LinkNode * newLink = CreateLinkList();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章