結構體的定義,因爲是單向鏈表,因此鏈表只有兩個域,一個是值域,用來存儲數據,另外一個是指針域,用來指向下一個空間。node
1 typedef int data_t; 2 typedef struct node{ 3 data_t data; 4 struct node* next; 5 }linklist;
因爲結構體已經定義完成,下面開始給結構體開空間,並賦值。函數
1 linklist *CreateLinklist() 2 { 3 linklist *head = (linklist *)malloc(sizeof(linklist)); 4 if(NULL == head) 5 { 6 return NULL; 7 } 8 head->data = -1; 9 head->next = NULL; 10 return head; 11 }
對鏈表進行判空處理。spa
1 int LinklistIsEmpty(linklist *head) 2 { 3 if(NULL != head) 4 { 5 return head->next == NULL?1:0; 6 } 7 }
獲取鏈表的個數指針
1 int GetLinklistLength(linklist *head) 2 { 3 if(NULL == head) 4 { 5 return -1; 6 } 7 8 int len = 0; 9 linklist *p = head->next; 10 while(p != NULL) 11 { 12 len++; 13 p = p->next; 14 } 15 return len; 16 }
插入元素code
1 int InsertLinklistData(linklist *head,int pos, data_t data) 2 { 3 if(NULL == head) 4 { 5 return -1; 6 } 7 int len = GetLinklistLength(head); 8 if(pos<0 || pos>len) 9 { 10 return -1; 11 } 12 13 linklist *p = head; 14 while(pos--) //找到要插入元素的前一個位置 15 { 16 p = p->next; 17 } 18 linklist *new = (linklist *)malloc(sizeof(linklist)); 19 new->next = NULL; 20 new->data = data; 21 22 new->next = p->next; 23 p->next = new; 24 25 return 0; 26 }
刪除元素blog
一、按位置刪除元素class
1 int DeleteLinklistByPos(linklist *head,int pos) 2 { 3 if(NULL == head) 4 { 5 return -1; 6 } 7 if(LinklistIsEmpty(head)) 8 { 9 return -1; 10 } 11 int len = GetLinklistLength(head); 12 if(pos<0 || pos>len) 13 { 14 return -1; 15 } 16 linklist *p = head; 17 linklist *q = NULL; 18 while(pos--) 19 { 20 p = p->next; 21 } 22 q = p->next; 23 24 p->next = q->next; 25 free(q); 26 q =NULL; 27 28 return 0; 29 }
二、按值刪除元素date
1 int DeleteLinklistByData(linklist *head,data_t data) 2 { 3 if(NULL == head) 4 { 5 return -1; 6 } 7 if(LinklistIsEmpty(head)) 8 { 9 return -1; 10 } 11 linklist *p = head; 12 linklist *q = p->next; 13 while(q != NULL) 14 { 15 if(q->data == data) 16 { 17 p->next = q->next; 18 free(q); 19 q =NULL; 20 } 21 p = q; 22 q = q->next; 23 } 24 return 0; 25 }
查詢數據im
1 int FindLinklistDataByPos(linklist *head,int pos) 2 { 3 if(NULL == head) 4 { 5 return -1; 6 } 7 if(LinklistIsEmpty(head)) 8 { 9 return -1; 10 } 11 int len = GetLinklistLength(head); 12 if(pos<0 || pos>len) 13 { 14 return -1; 15 } 16 linklist *p = head->next; 17 while(pos--) 18 { 19 p = p->next; 20 } 21 return p->data; 22 }
更新數據鏈表
1 int UpdateLinklistByPos(linklist *head,int pos,data_t data) 2 { 3 if(NULL == head) 4 { 5 return -1; 6 } 7 if(LinklistIsEmpty(head)) 8 { 9 return -1; 10 } 11 int len = GetLinklistLength(head); 12 if(pos<0 || pos>len) 13 { 14 return -1; 15 } 16 linklist *p = head->next; 17 while(pos--) 18 { 19 p = p->next; 20 } 21 p->data = data; 22 return 0; 23 }
打印鏈表
1 void PrintfLinklist(linklist *head) 2 { 3 if(NULL == head) 4 { 5 return -1; 6 } 7 if(LinklistIsEmpty(head)) 8 { 9 return -1; 10 } 11 linklist *p = head->next; 12 while(p != NULL) 13 { 14 printf("%d ",p->data); 15 p = p->next; 16 } 17 printf("\n"); 18 }
主函數
1 int main() 2 { 3 linklist *head = CreateLinklist(); 4 if(NULL == head) 5 { 6 return -1; 7 } 8 9 // 插入數據 10 int i = 0; 11 while(i<10) 12 { 13 InsertLinklistData(head,i,i+1); 14 } 15 PrintfLinklist(head); 16 17 //按位置刪除數據 18 DeleteLinklistByPos(head,2); 19 PrintfLinklist(head); 20 21 //按值刪除數據 22 DeleteLinklistByData(head,2); 23 PrintfLinklist(head); 24 25 //按位置查找數據 26 int ret = FindLinklistDataByPos(head,2); 27 printf("%d\n",ret); 28 29 //按位置更新數據 30 UpdateLinklistByPos(head,2,32); 31 PrintfLinklist(head); 32 }