線性錶鏈式儲存的實現詳解

來源:互聯網
上載者:User

標籤: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;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.