- 纯c实现单链表的增删改查
1.里面包含头插法和尾插法,分别对应逆序输出和顺序输出
(文中先将头插法注释化,采用尾插法顺序输出)
#include <stdio.h>
#include <stdlib.h>
typedef struct tagListNode{
int data;
struct tagListNode* next;
}ListNode, *List;
//函数声明
void PrintList(List head);
List headinsert (List head);
List rearinsert(List head);
List insert (List head); //增
List delete (List head); //删
List change (List head); //改
List search (List head); //查
//主函数
int main()
{
//分配链表头结点
ListNode *head;
head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
// printf("现在是!!逆序插入\n");
// printf("你想输入多少个数?回车后分别输入你要输入的数:\n");
// headinsert(head);
// printf("输出为:\n");
// PrintList(head);
printf("现在是!!顺序插入\n");
printf("你想输入多少个数?回车后分别输入你要输入的数:\n");
rearinsert(head);
printf("此时链表为:\n");
PrintList(head);
//元素插入
insert(head);
printf("此时链表为:\n");
PrintList(head);
//删除元素
delete(head);
printf("此时链表为:\n");
PrintList(head);
//元素修改
change(head);
printf("此时链表为:\n");
PrintList(head);
//元素查找
search(head);
return 0;
}
//头插法
List headinsert (List head)
{
int n ;
List a, b;//指针a和b
a = head;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
b = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &b->data);
b->next=a->next; //此时b->next指向了NULL; 因为a->next = head->next
a->next=b; //
}
return head;
}
//尾插法
List rearinsert(List head)
{
int n;
List a,b; //指针a和b;
a = head;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
b = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &b->data);
b->next = a->next;
a->next = b;
a=b;
}
return head;
}
//插入元素
List insert (List head)
{
int location_a, elem_b ,j;
List p,b;
j=0;
p=head;
printf("请输入你要插入的位置和元素值:\n");
scanf("%d%d", &location_a, &elem_b);
while ( p!= NULL && j<location_a-1)
{
p = p->next;
j++;
}//此时p指针已经移动要要插元素的上一个元素位置了
if( p==NULL)
{
printf("插入位置不合法:\n");
return head;
}
b = (ListNode *)malloc(sizeof(ListNode));
b->data = elem_b;
b->next = p->next;
p->next = b;
return head;
}
//删除元素
List delete(List head)
{
printf("请输入你要删除的元素的位置:\n");
int delete_a;
scanf("%d", &delete_a);
int j=0;
List p,q;
p = head;
while (p!=NULL && j<delete_a-1)
{
p = p->next;
j++;
}
if(p == NULL)
{
printf("删除位置不合法\n");
return head;
}
q = p->next;
p->next = q->next;
free(q);
return head;
}
//修改元素
List change(List head)
{
printf("输入你想修改的元素位置和修改后的元素值:\n");
int location,elem;
scanf("%d%d", &location ,&elem);
int j=0;
List p,q;
p = head;
while (p!=NULL && j<location-1)
{
p = p->next;
j++;
}
if(p == NULL)
{
printf("修改的位置不合法\n");
return head;
}
p->next->data = elem;
return head;
}
//查找元素
List search(List head)
{
printf("输入你想查找的元素的值:\n");
int elem,n=0;
scanf("%d", &elem);
List p,q;
p = head;
while (p!=NULL && p->data!=elem)
{
p = p->next;
n++;
}
printf("该元素的位置为:%d\n",n);
if(p==NULL)
{
printf("找不到该元素哦~\n");
}
return head;
}
//打印链表
void PrintList(List head)
{
ListNode* p = head->next;// 跳过头节点,p直接指向第一个数据元素
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}