题目:
代码:
main.c
#include<stdio.h>
#include"linklist.h"
int main(int argc, const char *argv[])
{
linklist *L=link_create();
if(L==NULL)
{
return -1;
}
list_insert_head(L,'Q');
list_insert_head(L,'W');
list_insert_head(L,'E');
list_insert_head(L,'R');
list_show(L);
list_insert_tail(L,'Q');
list_insert_tail(L,'W');
list_insert_tail(L,'E');
list_insert_tail(L,'R');
list_show(L);
list_insert_pos(L,9,'Z');
list_show(L);
list_delete_head(L);
list_show(L);
list_delete_tail(L);
list_show(L);
list_delete_pos(L,1);
list_show(L);
list_updata_pos(L,1,'T');
list_show(L);
//list_free(L);
list_updata_value(L,'T','A');
list_show(L);
list_reverse(L);
list_show(L);
return 0;
}
linklist.c
#include"linklist.h"
linklist *link_create(void)
{
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 L->next==NULL ? 1:0;
}
linklist *buy_node(datatype e)
{
linklist *p=(linklist*)malloc(sizeof(linklist));
if(p==NULL)
{
printf("空间申请失败\n");
return NULL;
}
p->data=e;
p->next=NULL;
return p;
}
int list_insert_head(linklist *L,datatype e)
{
if(NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
linklist *p=buy_node(e);
p->next=L->next;
L->next=p;
L->len++;
printf("头插成功\n");
return 1;
}
void list_show(linklist *L)
{
if(L==NULL||list_empty(L))
{
printf("遍历失败\n");
return;
}
linklist *p=L->next;
printf("链表元素分别:");
while(p!=NULL)
{
printf("%-3c",p->data);
p=p->next;
}
printf("\n");
}
int list_insert_tail(linklist *L,datatype e)
{
if(NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
linklist *p=L;
while(p->next!=NULL) p=p->next;
p->next=buy_node(e);
L->len++;
printf("尾插成功\n");
return 1;
}
linklist *find_node(linklist *L,int pos)
{
if(pos<0||pos>L->len)
{
printf("查找失败\n");
return NULL;
}
linklist *p=L;
for(int i=0;i<pos;i++) p=p->next;
return p;
}
int list_insert_pos(linklist *L,int pos,datatype e)
{
if(L==NULL||pos<0||pos>(L->len+1))
{
printf("插入失败\n");
return 0;
}
linklist *p=buy_node(e);
if(NULL==p)
{
printf("节点申请失败\n");
return 0;
}
linklist *q=find_node(L,pos-1);
if(q==NULL)
{
printf("查找前驱节点失败\n");
return 0;
}
p->next=q->next;
q->next=p;
L->len++;
printf("插入成功\n");
return 1;
}
int list_delete_head(linklist *L)
{
if(L==NULL||list_empty(L))
{
printf("头删失败\n");
return 0;
}
linklist *p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
printf("头删成功\n");
return 1;
}
int list_delete_tail(linklist *L)
{
if(L==NULL||list_empty(L))
{
printf("尾删失败\n");
return 0;
}
linklist *p=L;
while(p->next->next!=NULL) p=p->next;
free(p->next);
p->next=NULL;
L->len--;
printf("尾删成功\n");
return 1;
}
int list_delete_pos(linklist *L,int pos)
{
if(L==NULL||list_empty(L)||pos<1||pos>L->len)
{
printf("删除失败\n");
return 0;
}
linklist *q=find_node(L,pos-1);
linklist *p=q->next;
q->next=p->next;
free(p);
p=NULL;
L->len--;
printf("删除成功\n");
return 1;
}
int list_updata_pos(linklist *L,int pos,datatype e)
{
if(L==NULL||list_empty(L)||pos<1||pos>L->len)
{
printf("修改失败\n");
return 0;
}
linklist *p=find_node(L,pos);
p->data=e;
printf("修改成功\n");
return 1;
}
linklist *list_search_value(linklist *L,datatype e)
{
if(L==NULL||list_empty(L))
{
puts("查找失败\n");
return NULL;
}
linklist *p=L->next;
for(int i=1;i<=L->len;i++)
{
if(p->data==e) return p;
p=p->next;
}
return NULL;
}
int list_updata_value(linklist *L,datatype old_e,datatype new_e)
{
if(L==NULL||L->next==NULL)
{
printf("修改失败\n");
return 0;
}
linklist *p=list_search_value(L,old_e);
if(p!=NULL)
{
p->data=new_e;
printf("修改成功\n");
return 1;
}
else
{
printf("修改失败\n");
return 0;
}
}
void list_free(linklist *L)
{
if(L!=NULL)
{
while(L->next!=NULL) list_delete_head(L);
free(L);
L=NULL;
printf("释放成功\n");
}
}
void list_reverse(linklist *L)
{
linklist *p=link_create();
p->next=L->next;
L->next=NULL;
while(p->next!=NULL)
{
list_insert_head(L,p->next->data);
list_delete_head(p);
}
list_free(p);
}
linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct node
{
union
{
int len;
datatype data;
};
struct node *next;
}linklist;
linklist *link_create(void);
int list_empty(linklist *L);
linklist *buy_node(datatype e);
int list_insert_head(linklist *L,datatype e);
void list_show(linklist *L);
int list_insert_tail(linklist *L,datatype e);
linklist *find_node(linklist *L,int pos);
int list_insert_pos(linklist *L,int pos,datatype e);
int list_delete_head(linklist *L);
int list_delete_tail(linklist *L);
int list_delete_pos(linklist *L,int pos);
int list_updata_pos(linklist *L,int pos,datatype e);
linklist *list_search_value(linklist *L,datatype e);
void list_free(linklist *L);
int list_updata_value(linklist *L,datatype old_e,datatype new_e);
void list_reverse(linklist *L);
#endif
运行结果:
结果一:
ubuntu@ubuntu:11.25$ ./a.out
创建成功
头插成功
头插成功
头插成功
头插成功
链表元素分别:R E W Q
尾插成功
尾插成功
尾插成功
尾插成功
链表元素分别:R E W Q Q W E R
插入成功
链表元素分别:R E W Q Q W E R Z
头删成功
链表元素分别:E W Q Q W E R Z
尾删成功
链表元素分别:E W Q Q W E R
删除成功
链表元素分别:W Q Q W E R
修改成功
链表元素分别:T Q Q W E R
修改成功
链表元素分别:A Q Q W E R
结果二:
ubuntu@ubuntu:11.25$ ./a.out
创建成功
头插成功
头插成功
头插成功
头插成功
链表元素分别:R E W Q
尾插成功
尾插成功
尾插成功
尾插成功
链表元素分别:R E W Q Q W E R
插入成功
链表元素分别:R E W Q Q W E R Z
头删成功
链表元素分别:E W Q Q W E R Z
尾删成功
链表元素分别:E W Q Q W E R
删除成功
链表元素分别:W Q Q W E R
修改成功
链表元素分别:T Q Q W E R
修改成功
链表元素分别:A Q Q W E R
创建成功
头插成功
头删成功
头插成功
头删成功
头插成功
头删成功
头插成功
头删成功
头插成功
头删成功
头插成功
头删成功
释放成功
链表元素分别:R E W Q Q A