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;
}

posted @ 2019-07-22 22:21  灰机12321  阅读(158)  评论(0编辑  收藏  举报