鏈式存儲結構-單向鏈表
//linkedlist.c
#include <stdio.h>
#include <stdlib.h>
//類型
typedef struct node{
int data; //數據區域
struct node *next; // 下一個節點的指針
// linklist_t* next;// 編譯器 只能從上往下解釋
}linklist_t;
//建立
linklist_t* create_linklist()
{
linklist_t* list=malloc(sizeof(linklist_t));
list->next=NULL;//指針變量 賦值爲 NULL
return list;
}
//判空
int isnull_linklist(linklist_t* list)
{
if(list==NULL)
return 0;
return list->next==NULL;
}
//插入
int insert_linklist(linklist_t* list,int data)
{
//1
if(list==NULL)
return -1;
//2
linklist_t* newnode=create_linklist();
newnode->data=data;
//3
newnode->next=list->next;
//4
list->next=newnode;
return 0;
}
//刪除
int delete_linklist(linklist_t* list)
{
//1
if(list==NULL||isnull_linklist(list))
return -1;
//2
linklist_t* temp=list->next;
//3
//list->next=list->next->next;
list->next=temp->next;
free(temp);
return 0;
}
//查找
//1. 返回節點地址 比返回第幾個要更方便
//2. 返回 節點前一個節點的地址比返回 本節點地址更方便
//方便除了修改之外,插入,刪除等操做。
linklist_t* locate_linklist(linklist_t* list,int data)
{
//1
if(list==NULL||isnull_linklist(list))
return NULL;
//2 遍歷
while(list->next!=NULL)
{
if(list->next->data==data)
return list;
list=list->next;
}
return NULL;
}
//修改
int change_linklist(linklist_t* list,int data)
{
if(list==NULL||isnull_linklist(list))
return -1;
list->next->data=data;
return 0;
}
//打印
int print_linklist(linklist_t* list)
{
//1
if(list==NULL||isnull_linklist(list))
return -1;
//2
while(list->next!=NULL)
{
printf("%3d ",list->next->data);
list=list->next;
}
printf("\n");
return 0;
}
//逆打印1 遞歸 影分身
void re_print_linlist_digui(linklist_t* list)
{
if(list->next==NULL)
return ; // void 類型返回 return ;
re_print_linlist_digui(list->next);
printf("%3d ",list->next->data);
return ;//不寫 由編譯器替你補齊
}
//長度
int length_linklist(linklist_t* list)
{
//1
if(list==NULL||isnull_linklist(list))
return 0;
int sum=0;
//2
while(list->next!=NULL)
{
sum++;
list=list->next;
}
return sum;
}
//清空
int clear_list(linklist_t* list)
{
if(list==NULL||isnull_linklist(list))
return -1;
while(!isnull_linklist(list))//while(length_linklist(list))//while(list->next!=NULL)
{
delete_linklist(list);
}
return 0;
}
//銷燬
int destroy_linklist(linklist_t* list)
{
if(list==NULL)
return -1;
if(!isnull_linklist(list))
clear_list(list);
free(list);
return 0;
}
//逆打印2 過河拆橋
//
//使用以前的基本函數
//
//過河? 橋? --》另 一個 鏈表
//
//
//拆?
//
//思路: 插入 1.2.3.。。。。20 順序 插入
//而 打印的時候 20 。19.。。。。3.2.1 的順序 打印
//
//要求 -》1.2.3.。。20 打印出來?
int re_print_linlist_guohechaiqiao(linklist_t* list)
{
//1
if(list==NULL||isnull_linklist(list))
return -1;
linklist_t* temp=create_linklist();
//建立的逆序表
//
while(list->next!=NULL)
{
insert_linklist(temp,list->next->data);
list=list->next;
}
print_linklist(temp);
destroy_linklist(temp);
return 0;
}
int main(int argc, const char *argv[])
{
linklist_t* list=create_linklist();//創造頭結點
int i;
for(i=1;i<=20;i++)
{
insert_linklist(list,i*10);
print_linklist(list);
}
change_linklist(locate_linklist(list,150),888);
print_linklist(list);
insert_linklist(locate_linklist(list,888),150);
print_linklist(list);
delete_linklist(locate_linklist(list,888));
print_linklist(list);
re_print_linlist_digui(list);
printf("\n");
re_print_linlist_guohechaiqiao(list);
printf("length_linklist %d\n",length_linklist(list));
clear_list(list);
printf("length_linklist %d\n",length_linklist(list));
destroy_linklist(list);
#if 0
for(i=1;i<=20;i++)
{
delete_linklist(list);
print_linklist(list);
}
#endif
return 0;
}