本实验是利用单链表实现增删改查(西南科技大学软件基础技术实验2)
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
//linklist结构体
typedef struct node{
datatype data;//数据域
struct node *next; //指针域
}linklist;
linklist *head=NULL; //头节点
linklist *r=NULL; //尾结点
//创建单链表
linklist *createlist(){
char ch;
linklist *s;//新节点
head = (linklist * )malloc(sizeof(linklist));//创一个空间
r=head;//尾指向头
printf("请输入字符产生链表,以#结束\n");
ch =getchar();
while (ch!='#'){
s= (linklist *)malloc(sizeof(linklist));//生成新结点
s->data =ch; //将输入的值放进新节点s中
r->next =s; //将尾结点的指针指向新节点
r=s;//将新结点变为尾结点
ch = getchar();
}
r->next=NULL; //当尾结点的指针域为空
return head; //返回头结点
}
//遍历单链表
void Printl(){
linklist *t = head->next;
while (t != NULL)
{
printf("%c",t->data);
t=t->next;
}
}
//查询
linklist *get(linklist *head,int i){
int j =0 ;
linklist *p =head;
while ((p->next!=NULL)&&(j<i)){
p=p->next;
j++;
}
if(j==i){
return p;
}else{
return NULL;
}
}
//按位
//增加对应位置的值
linklist *add(linklist *head,int i,char x){
linklist *s,*p;
int j=0;
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
p=head;
while (p!=NULL&&j<i-1)
{
j++;
p=p->next;
}
if(p!=NULL){
s->next=p->next;
p->next=s;
}else{
printf("结点未找到\n");
}
return p;
}
//添加在输入结点之后
linklist *add_1(linklist *head,int i,char x){
linklist *s,*p;
int j=0;
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
p=head;
while (p!=NULL&&j<i)
{
j++;
p=p->next;
}
if(p!=NULL){
s->next=p->next;
p->next=s;
}else{
printf("结点未找到\n");
}
return p;
}
//删除对应结点的值
linklist *Remove_1(linklist *head,int i){
linklist *p;
linklist *s;
int j=0;
p=head;
while(p->next!=NULL&&j<i-1){
j++;
p=p->next;
}
if(j!=i-1){
printf("非法");
}
s=p->next;
p->next=s->next;
free(s);
return head;
}
//main方法
void main(){
linklist *head;
linklist *r;
int num;
head=createlist();
printf("链表的信息为:");
Printl(); //遍历
printf("\n");
//查
printf("输入要查询的序号:\n");
scanf("%d",&num);
r=get(head,num);
if(r==NULL){
printf("没有查到\n");
}else{
printf("查到的结果为:%c\n",r->data );
}
printf("\n");
//增对应位置
int add1;
char char1;
printf("请输入插入位置的序号和插入的值:");
scanf("%d"" " "%c",&add1,&char1);
r=add(head,add1,char1);
Printl();
printf("\n");
//增对应结点之后
int add2;
char char2;
printf("请输入插入位置前的序号和插入的值:");
scanf("%d"" " "%c",&add2,&char2);
r=add_1(head,add2,char2);
Printl();
printf("\n");
//删
int rem;
printf("请输入删除位置序号");
scanf("%d",&rem);
r=Remove_1(head,rem);
Printl();
printf("\n");
//改
int revise;
char revi;
printf("请输入你看想修改的位置序号和修改后的值\n");
scanf("%d"" ""%c",&revise,&revi);
r=Remove_1(head,revise);
r=add(head,revise,revi);
Printl();
printf("\n");
}