標籤:c 資料結構 線性表 單鏈表 鏈表
本文原創,轉載請註明:http://blog.csdn.net/j903829182/article/details/38173681
#include<stdio.h>#include<malloc.h>//線性表的鏈式儲存和實現,帶頭點#define true 1#define false 0typedef int DataType;//定義抽象資料類型//節點的結構體typedef struct Node{ DataType data;//節點的資料域 struct Node *next;//節點的指標域}SLNode;//初始化//這裡參數使用了指標的指標,是為了使主函數裡的頭指標指向這個函數開闢的空間節點//如果不使用指標的指標,指向頭指標,那麼c語言的函數都是進行值傳遞的,這裡的參數儲存的是//主函數裡面頭指標的值得副本,為參數賦值後,不能改變頭指標指向的值//使用指標的指標儲存的是頭指標的地址,那麼對這個地來址裡面值的改變,就是對頭指標裡面值得改變//所以這裡需要使用指標的指標,來進行對實參值的改變void ListInitiate(SLNode **head){ *head=(SLNode*)malloc(sizeof(SLNode));//申請前端節點,使頭指標指向前端節點 (*head)->next=NULL;//設定結束標誌為NULL}//求當前元素個數int ListLength(SLNode *head){ int num=0;//初始變數num用來計數SLNode *p=head;//p指向前端節點while(p->next!=NULL){//迴圈計數 p=p->next;//p指向p的下一個節點 num++;//累加}return num;//返回計數的值}//插入節點,我這裡把前端節點設定為0位置,插入資料元素時,應該從1開始int ListInsert(SLNode *head,int i,DataType data){ int j=0;//計數變數初始化為0 SLNode *p=head,*q;//p指向前端節點//為了在i位置插入資料,應該找到i-1位置的節點,為了便於計數,我把節點從1開始計數節點的while(p->next!=NULL&&j<i-1){//最終讓p指向第i-1個節點 p=p->next;//p指向下一個節點 j++;//變數累加計數}if(j!=i-1){ printf("插入位置出錯!!!\n");//輸出提示資訊 return false;//返回操作結果} q=(SLNode *)malloc(sizeof(SLNode));//產生新節點q->data=data;//把資料給新開闢的節點q->next=p->next;//q指向的下一個節點是p的指向的下一個節點p->next=q;//p的下一個節點變為qreturn true;//返回操作結果}//刪除指定的節點int ListDelete(SLNode *head,int i,DataType *data){ SLNode *p=head,*s;//指向前端節點int j=0;//變數用來進行計數while(p->next!=NULL&&j<i-1){//找到第i-1個節點 p=p->next;//p指向p的下一個節點 j++;//自加}if(j!=i-1){ printf("刪除位元置出錯!!!\n");//輸出提示資訊 return false;//返回操作結果}s=p->next;//找到*data=s->data;//把藥刪除節點的資料賦值給datap->next=s->next;//p的下一個節點為i+1free(s);//釋放s節點,即第i個節點return true;//返回結果}//取資料元素int ListGet(SLNode *head,int i,DataType *data){ SLNode *p=head;//指向前端節點int j=0;//計數變數初始化為0 while(p->next!=NULL&&j<i){//尋找第i個節點 p=p->next;//p指向下一個元素 j++;//變數自加}if(j!=i){//判斷j是否等於i,是否尋找到了 printf("取元素的位置出錯!!!\n");//輸出錯誤資訊提示 return false;//返回操作結果}*data=p->data;//把資料賦值給data指標return true;//返回操作結果}//輸出鏈表void displayList(SLNode *head){//列印輸出鏈表的所有資料SLNode *p=head;//指向前端節點while(p->next!=NULL){//判斷下一個節點是否為空白p=p->next;//p指向下一個節點 printf("-> %d",p->data);//輸出資訊}printf("\n");//換行}//撤銷單鏈表//參數用指標的指標是為了改變頭指標的值。不使用,則不能改變void Destroy(SLNode **head){//撤銷鏈表的節點 SLNode *p=*head,*q; while(p->next!=NULL){//判斷是否為空白 q=p;//把q指向p所指向的節點 p=p->next;//p指向一個節點下 free(q);//釋放q所指向的節點 } *head=NULL;//使頭指標指向空}//主函數int main(){SLNode *head;//定義指標變數int i,x;////定義int變數ListInitiate(&head);//初始化頭指標變數,傳的是頭指標的地址,為的是能得到函數改變頭指標變數的值printf("sizeof=%d head=%d\n",sizeof(SLNode),head);//測試結構體的占的記憶體大小,和頭指標的值for(i=1;i<=10;i++){//進行迴圈 ListInsert(head,i,i);//進行鏈表的插入}displayList(head);//輸出鏈表裡面的所有資料for(i=1;i<=ListLength(head);i++){//進行迴圈 ListGet(head,i,&x);//取鏈表裡面的值,放到x變數裡面printf("%d ",x);//輸出x的值}printf("\n");//換行ListDelete(head,5,&x);//刪除第五個元素printf("x=%d\n",x);//輸出刪除元素的值displayList(head);//再次輸出鏈表裡面的所有資料 return 0;}