1>单链表任意位置删除
2>单链表任意位置修改
3>单链表任意位置查找
#ifndef __HEAD2_H__
#define __HEAD2_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype[20];
//定义结点结构体
typedef struct Node
{
//数据域:
union{
int len;//头结点的数据域
datatype data;//其他结点数据域
};
//指针域:下一个结点的地址
struct Node *next;
}*Linklist;
Linklist create_head();
Linklist create_node();
int insert_head(Linklist L,datatype e,int n);
int insert_rear(Linklist L,datatype e,int n);
int delete_head(Linklist L);
int delete_rear(Linklist L);
void output(Linklist L);
int insert_bypos(Linklist L,int pos,datatype e);
int delete_bypos(Linklist L,int pos);
int update_bypos(Linklist L,int pos,datatype e);
int serach_bypos(Linklist L,int pos);
#endif
#include "head2.h"
Linklist create_head()
{
Linklist L=(Linklist)malloc(sizeof(struct Node));
if(NULL==L)
return NULL;
L->len=0;
L->next=NULL;
return L;
}
Linklist create_node()
{
Linklist p=(Linklist)malloc(sizeof(struct Node));
if(NULL==p)
return NULL;
strcpy(p->data,"");
p->next=NULL;
return p;
}
int insert_head(Linklist L,datatype e,int n)
{
int i;
for(i=0;i<n;i++){
printf("请输入插入的第%d个元素:",i+1);
scanf("%s",e);
if(NULL==L){
printf("头插失败\n");
return -1;
}
//堆区申请其他结点空间
Linklist p=create_node();
//p的数据赋值为e
strcpy(p->data,e);
//p的指针域
p->next=L->next;
L->next=p;
//链表长度自增
L->len++;
getchar();
}
return 0;
}
int insert_rear(Linklist L,datatype e,int n)
{
int i;
for(i=0;i<n;i++){
printf("请输入插入的第%d个元素:",i+1);
scanf("%s",e);
if(NULL==L){
printf("头插失败\n");
return -1;
}
//循环到尾部结点
Linklist p=L;
while(p->next!=NULL){
p=p->next;
}
//创建新结点
Linklist s=create_node();
//数据给到s的数据域
strcpy(s->data,e);
//s地址给p的下一个
p->next=s;
L->len++;
getchar();
}
return 0;
}
int delete_head(Linklist L)
{
if(NULL==L||L->len==0)
{
printf("删除失败\n");
return -1;
}
Linklist q=L->next;
L->next=q->next;
free(q);
q=NULL;
L->len--;
return 0;
}
int delete_rear(Linklist L)
{
if(NULL==L||L->len==0)
{
printf("删除失败\n");
return -1;
}
//找到尾部的前一个结点
Linklist p=L;
int i;
for(i=0;i<L->len-1;i++){
p=p->next;
}
free(p->next);
p->next=NULL;
L->len--;
return 0;
}
int insert_bypos(Linklist L,int pos,datatype e)
{
printf("请输入插入的位置:");
scanf("%d",&pos);
printf("请输入插入的元素:");
scanf("%s",e);
if(NULL==L||pos<1||pos>L->len+1)
{
printf("插入失败\n");
return -1;
}
Linklist p=L;
int i;
for(i=0;i<pos-1;i++){
p=p->next;
}
Linklist s=create_node();
strcpy(s->data,e);
s->next=p->next;
p->next=s;
L->len++;
getchar();
return 0;
}
int delete_bypos(Linklist L,int pos)
{
printf("请输入删除的位置:");
scanf("%d",&pos);
if(NULL==L||pos<1||pos>L->len)
{
printf("删除失败\n");
return -1;
}
Linklist p=L;
int i;
for(i=0;i<pos-1;i++){
p=p->next;
}
Linklist q=p->next;
free(q);
p->next=q->next;
L->len--;
return 0;
}
int update_bypos(Linklist L,int pos,datatype e)
{
printf("请输入修改的位置:");
scanf("%d",&pos);
printf("请输入修改的值:");
scanf("%s",e);
if(NULL==L||pos<1||pos>L->len)
{
printf("修改失败\n");
return -1;
}
Linklist p=L;
int i;
for(i=0;i<pos;i++){
p=p->next;
}
strcpy(p->data,e);
return 0;
}
int serach_bypos(Linklist L,int pos)
{
printf("请输入查找的位置:");
scanf("%d",&pos);
if(NULL==L||pos<1||pos>L->len)
{
printf("查找失败\n");
return -1;
}
Linklist p=L;
int i;
for(i=0;i<pos;i++){
p=p->next;
}
printf("查找的结果为:%s\n",p->data);
return 0;
}
void output(Linklist L)
{
//判断头结点是否存在
//判断链表是否为空
if(NULL==L||L->len==0){
printf("表空或者头结点不存在\n");
}
printf("结果为:");
#if 0
//for循环输出头结点地址不能动
Linklist p=L;
int i;
for(i=0;i<L->len;i++){
p=p->next;
printf("结果为:%s\t",p->data);
}
#endif
//while循环输出头结点地址可以动
while(L->next!=NULL){
L=L->next;
printf("%s\t",L->data);
}
putchar('\n');
}
#include "head2.h"
#include "test2.c"
int main(int argc, const char *argv[])
{
//创建头结点
Linklist L=create_head();
int n;
int pos;
datatype e;
printf("请输入插入的元素个数:");
scanf("%d",&n);
#if 0
//头插
insert_head(L,e,n);
#endif
//尾插
insert_rear(L,e,n);
#if 0
//头删
delete_head(L);
//尾删
delete_rear(L);
//按位置插入
insert_bypos(L,pos,e);
output(L);
#endif
//按位置删除
delete_bypos(L,pos);
output(L);
//按位置修改
update_bypos(L,pos,e);
output(L);
//按位置查找
serach_bypos(L,pos);
#if 0
//遍历链表
output(L);
#endif
return 0;
}