数据结构day2-链表
Linklist.h
#ifndef __LINKLIST__
#define __LINKLIST__
typedef char datatype;//定义数据类型
typedef struct Node //定义链表数据类型
{
union
{
datatype data;//数据域
int len;
};
struct Node *next;//指针域
}Linklist;
//创建
Linklist *list_create();
//判空
int list_empty(Linklist *L);
//遍历
void listshow(Linklist *L);
//按位置查找节点指针
Linklist *find_node(Linklist *L,int pos);
//尾删1
int list_delete_tail(Linklist *L);
//尾删2
int list_delete_tail2(Linklist *L);
//按位置修改
int list_update_pos(Linklist *L, int pos,datatype e);
//按值修改
int list_update_value(Linklist *L, datatype old_e, datatype new_e);
//链表反转函数
void list_reverse(Linklist *L);
Linklist.c
#include<stdio.h>
#include"Linklist.h"
#include<stdlib.h>
//尾删
int list_delete_tail(Linklist *L)
{
//判断
if(NULL==L||list_empty(L))
{printf("链表为空,删除失败\n");return -1;}
// 找到倒数第二个节点
Linklist *p=L;
while(p->next->next!=NULL)
{p=p->next;}
//标记要删除的节点
Linklist *q=p->next;
//置空
p->next=NULL;
//释放最后节点的空间
free(q);
q=NULL;
L->len--;
printf("尾删成功\n");
return 0;
}
//尾删2
int list_delete_tail2(Linklist *L)
{
//判断
if(NULL==L||list_empty(L))
{printf("链表为空,删除失败\n");return -1;}
// 找到倒数第二个节点
Linklist *p=find_node(L,L->len-1);
//标记要删除的节点
Linklist *q=p->next;
//置空
p->next=NULL;
//释放最后节点的空间
free(q);
q=NULL;
L->len--;
printf("尾删成功\n");
return 0;
}
//按位置修改链表
int list_update_pos(Linklist *L,int pos,datatype e)
{
if(L==NULL||list_empty(L)||pos<1||pos>L->len)
{printf("链表为空,修改失败\n");}
Linklist *p=find_node(L,pos);
p->data=e;
printf("位置%d修改成功\n",pos);
}
//按值修改链表
int list_update_value(Linklist *L, datatype old_e, datatype new_e)
{
if(L==NULL||list_empty(L))
{printf("链表为空,修改失败\n");}
Linklist *p=L;int flag=1;
for(int i=1;i<L->len+1;i++)
{
p=p->next;
if(p->data==old_e)
{p->data=new_e;flag=1;}
}
if(flag==1)
{
printf("修改成功\n");
}
else
{
printf("无重复值\n");
}
}
//链表反置函数
void list_reverse(Linklist *L)
{
if(NULL==L||list_empty(L))
{printf("链表为空,无法排序\n");return -1;}
if(L->len==1)
{
printf("无需排序\n",return 0;);
}
Linklist *p=NULL;
Linklist *q=NULL;
Linklist *n=NULL;
for(int i=2;i<L->len+1;i++)
{
p=find_node(L,i-1);
q=L->next;
L->next=p->next;
if(i<L->len)
{n=p->next->next;}
else
{n=NULL;}
p->next->next=q;
p->next=n;
}
printf("排序成功\n");
return 0;
}
//反置函数第二种方法
void list_reverse2(Linklist *L)
{
Linklist *s=L->next;
Linklist *p=s->next;
L->next=NULL;
while(s!=NULL)
{
p=s;
s=s->next;
p->next=L->next;
L->next=p;
}
return;
}
//创建链表表头(火车头)
Linklist *list_create()
{
Linklist *L=(Linklist*)malloc(sizeof(Linklist));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
//初始化
L->len=0;
L->next=NULL;
printf("创建成功\n");
return L;
}
//判空
int list_empty(Linklist *L)
{
return NULL==L->next?1:0;
}
//遍历函数:显示链表结果
void listshow(Linklist *L)
{
if(NULL==L || list_empty(L))
{
printf("链表为空\n");
return;
}
//遍历逻辑
printf("链表结果为;\n");
Linklist *q =L->next;
while(q!=NULL)
{
printf("%c\t",q->data);
q=q->next;
}
printf("\n");
return;
}
//按位置查找返回查找到的节点
Linklist *find_node(Linklist *L,int pos)
{
if(NULL==L||pos<0||pos>L->len)//判断逻辑
{printf("查找失败\n");return NULL;}
//查找节点
Linklist *q=L;
for(int i=1;i<pos+1;i++)
{
q=q->next;
}
return q;
}
main.c
#include<stdio.h>
#include"Linklist.h"
int main(int argc, const char *argv[])
{
Linklist *L = list_create();
if(NULL==L)
{
return -1;
}
//调用头插函数
list_insert_head(L,'w');
list_insert_head(L,'e');
list_insert_head(L,'l');
list_insert_head(L,'l');
list_insert_head(L,'d');
list_insert_head(L,'o');
list_insert_head(L,'n');
list_insert_head(L,'e');
printf("尾删1测试\n");
list_delete_tail(L);
listshow(L);
printf("尾删2测试\n");
list_delete_tail2(L);
listshow(L);
printf("按位置修改测试\n");
list_update_pos(L,2,'Y');
listshow(L);
printf("按值修改测试\n");
list_update_value(L,'Y','L');
listshow(L);
printf("反置测试\n");
list_reverse(L);
listshow(L);
}
results
ubuntu@ubuntu:02_day$ gcc *.c
Linklist.c: In function ‘add_test’:
Linklist.c:184:6: warning: comparison of distinct pointer types lacks a cast
if(p==&p->data)
^~
ubuntu@ubuntu:02_day$ ./a.out
创建成功
头插成功
头插成功
头插成功
头插成功
头插成功
头插成功
头插成功
头插成功
尾删1测试
尾删成功
链表结果为;
e n o d l l e
尾删2测试
尾删成功
链表结果为;
e n o d l l
按位置修改测试
位置2修改成功
链表结果为;
e Y o d l l
按值修改测试
修改成功
链表结果为;
e L o d l l
反置测试
排序成功
链表结果为;
l l d o L e