step3 . day2 数据结构之线性表链表
今天繼續學習數據結構的線性表部分,從基礎的順序表到鏈表,類比寫了一些調用函數,完成了表的增刪改查排序等問題。
尤其是鏈表的排序,費了很大的心思終于捋順寫出來了,小有成就感,而且代碼一次通過率越來越高,幾乎不用修改就能測試通過了,make傲嬌一小會。
#include <stdio.h>
#include <stdlib.h>
//重定義數據類型名
typedef int datetype;
//鏈表結構體
typedef struct linklist{
datetype date;
struct linklist *next;
}linklist,*linklist_p;
//鏈表頭創建
linklist_p linklist_creat(){
linklist_p head = NULL;
head = (linklist_p)malloc(sizeof(linklist)); //分配空間
if(!head){
printf("malloc failed\n");
return NULL;
}
// memset(&(head->date),0,sizeof(datetype)); //數據出初始化
head->next = NULL;
return head;
}
//頭部插入
void linklist_head_insert(linklist_p head,datetype value){
linklist_p temp = NULL;
temp = linklist_creat();
temp->date = value;
temp->next = head->next;
head->next = temp;
}
//遍歷鏈表
void linklist_show(linklist_p head){
while(head->next != NULL){
printf("%d ",head->next->date);
head = head->next;
}
puts("");
}
//尾部插入
void linklist_tail_insert(linklist_p head,datetype value){
linklist_p temp = NULL;
temp = linklist_creat();
temp->date = value;
temp->next = NULL;
while(head->next !=NULL){
head = head->next;
}
head->next = temp;
}
//按照位置插入
void linklist_pos_insert(linklist_p head,int pos,datetype value){
linklist_p temp = NULL;
temp = linklist_creat();
temp->date = value;
int i = 1;
while(head->next !=NULL && i < pos){
head = head->next;
i++;
}
if(i == pos){
temp->next = head->next;
head->next = temp;
}
else
printf("position illegal\n");
}
//查找
int linklist_search(linklist_p head,datetype value){
int pos = 1;
while(head->next != NULL){
if(head->next->date == value){
return pos;
}
pos++;
head = head->next;
}
return -1;
}
//按值修改
void linklist_value_update(linklist_p head,datetype old,datetype new){
while(head->next != NULL){
if(head->next->date == old){
head->next->date = new;
}
head = head->next;
}
}
//按位置修改
void linklist_pos_update(linklist_p head,int pos,datetype value){
int i=1;
while(head->next != NULL && i<pos){
head = head->next;
i++;
}
if(i == pos && head->next !=NULL){
head->next->date = value;
}
else{
printf("can not find\n");
}
}
//判斷是否為空表
int linklist_is_empty(linklist_p head){
return head->next == NULL? 1 : 0;
}
//頭部刪除
datetype linklist_head_del(linklist_p head){
if(linklist_is_empty(head)){
printf("linklist is empty\n");
return -1;
}
int value = head->next->date;
linklist_p temp = head->next;
head->next = head->next->next;
free(temp);
temp =NULL;
return value;
}
//尾部刪除
datetype linklist_tail_del(linklist_p head){
while(head->next->next != NULL){
head = head->next;
}
int value =head->next->date;
linklist_p temp = head->next;
head->next = NULL;
free(temp);
temp = NULL;
return value;
}
//翻轉輸出
void linklist_reversal(linklist_p head){
linklist_p p,q;
p = head->next;
head->next =NULL;
while(p != NULL){
q = p;
p = p->next;
q->next = head->next;
head->next = q;
}
}
//鏈表清空
void linklist_clear(linklist_p head){
linklist_p p,q;
p = head->next;
head->next =NULL;
while(p != NULL){
q = p;
p = p->next;
free(q);
q=NULL;
}
}
//排序
void linklist_sort(linklist_p head){
linklist_p p,q,temp;
//p為拆分后待排序鏈表頭指針
//q為排序完成呆釋放數據元素
//temp為排序完成最小數據元素比較值指針
p = head->next->next;
head->next->next = NULL; //拆分鏈表
while(p != NULL){
int pos = 1; //初始插入點
linklist_p temp = head; //定位排序ok初始鏈表
while(temp->next !=NULL){ //尋找插入點
if(p->date < temp->next->date){
linklist_pos_insert(head,pos,p->date);
q = p;
p = p->next;
free(q);
q = NULL;
break;
}
else{//第一位未找到插入,位置后移,對比值后移
pos++;
temp = temp->next;
}
}
if(temp->next == NULL){ //值大于所以已排序好鏈表數據元素
linklist_tail_insert(head,p->date);
q = p;
p = p->next;
free(q);
q = NULL;
}
}
}
?
//刪除重復數據
void linklist_repeat_del(linklist_p head){
linklist_p itemp = head->next;
linklist_p jtemp = itemp->next;
linklist_p p = NULL;
while(jtemp){
if(jtemp->date == itemp->date){
itemp->next = jtemp->next;
p = jtemp;
free(p);
p =NULL;
jtemp = jtemp->next;
continue;
}
itemp = itemp->next;
jtemp = itemp->next;
}
}
//按照順序插入
int main(int argc, const char *argv[])
{
linklist_p list = linklist_creat();
linklist_head_insert(list,4);
linklist_head_insert(list,100);
linklist_head_insert(list,1);
linklist_head_insert(list,2);
linklist_head_insert(list,3);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,5);
linklist_head_insert(list,9);
linklist_head_insert(list,100);
linklist_head_insert(list,8);
linklist_head_insert(list,100);
linklist_head_insert(list,6);
// linklist_show(list);
// linklist_tail_insert(list,9);
// linklist_show(list);
// linklist_pos_insert(list,11,100);
// linklist_show(list);
// printf("pos = %d\n",linklist_search(list,8));
// linklist_value_update(list,7,111);
// linklist_show(list);
// linklist_pos_update(list,13,11);
// linklist_show(list);
// printf("%d\n",linklist_head_del(list));
// linklist_show(list);
// printf("%d\n",linklist_tail_del(list));
// linklist_show(list);
linklist_reversal(list);
linklist_show(list);
// linklist_clear(list);
// linklist_show(list);
linklist_sort(list);
linklist_show(list);
linklist_repeat_del(list);
linklist_show(list);
return 0;
}
轉載于:https://www.cnblogs.com/huiji12321/p/11228894.html
總結
以上是生活随笔為你收集整理的step3 . day2 数据结构之线性表链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AS3 RPG游戏引擎开发日志3:地图坐
- 下一篇: jMenu 不添加item 直接自己添加