单链表的创建、插入和删除操作
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct List
{
ElemType data; //数据域
struct List *next; //指针域
} Node, *LinkedList;
//头插法创建链表,将新增节点插头第一个节点之前
LinkedList createH()
{
Node *L = (Node *)malloc(sizeof(Node)); //申请一个数据域为空的头节点
if(L == NULL)
{
printf("分配空间失败!\n");
exit(0);
}
L->next = NULL;
int nodeNum;
printf("输入节点数量: ");
scanf("%d",&nodeNum);
printf("\n");
printf("输入节点数据: ");
for(int i=0; i<nodeNum; i++) //依次插入节点
{
ElemType data;
scanf("%d",&data);
Node *p = (Node *)malloc(sizeof(Node)); //申请节点空间
if(p == NULL)
{
printf("分配空间失败!\n");
exit(0);
}
p->data = data;
p->next = L->next; //头结点指向新增节点
L->next = p; //新增节点指向第一个节点
}
return L; //返回头节点
}
//尾插法建立链表,新增节点插入最后一个节点之后
LinkedList createT()
{
Node *L, *pre;
L = (Node*)malloc(sizeof(Node)); //为头结点申请空间
if(L == NULL) //判断是否申请失败
{
printf("申请内存失败!\n");
exit(0);
}
L->next = NULL;
pre = L; //pre始终指向链表尾部
int nodeNum;
printf("输入节点数量: ");
scanf("%d",&nodeNum);
printf("\n");
printf("输入节点数据: ");
ElemType data;
for(int i=0; i<nodeNum; i++)
{
scanf("%d",&data);
Node *p = (Node *)malloc(sizeof(Node)); //为新增节点分配空间
if(p == NULL)
{
printf("申请内存失败!\n");
exit(0);
}
p->data = data;
p->next = NULL;
pre->next = p; //新增节点插入链表尾部
pre = pre->next; //pre移到尾部
}
return L;
}
//在指定位置插入节点
void insertNode(LinkedList L)
{
int pos; //插入位置
ElemType data; //插入节点数据
printf("输入插入位置, 插入节点的数据: ");
scanf("%d %d",&pos,&data);
LinkedList p = L; //指针p查找插入位置
int cnt = 0;
while(cnt<pos)
{
if(p->next == NULL && cnt<pos) //判断插入位置是否大于链表长度
{
printf("超出链表长度\n");
return;
// exit(0);
}
p = p->next; //指针p一直滑动到要插入的位置
cnt++;
}
Node *r = (Node *)malloc(sizeof(Node)); //为插入节点申请空间
r->data = data;
r->next = p->next; //插入链表对应位置
p->next = r;
}
//删除链表中的一个数据为x的节点
void deleteNode(LinkedList L)
{
ElemType data;
printf("输出要删除的数据: ");
scanf("%d",&data);
LinkedList p = L; //p节点进行查找
LinkedList r = L->next; //r表示p节点后的一个节点
if(L->next==NULL) //判断链表是否为空
{
printf("链表为空!\n");
return;
// exit(0);
}
while(r->next!=NULL) //找到要删除数据的位置
{
printf("test\n");
if(r->data == data) break;
p = p->next;
r = r->next;
}
if(r->data != data) //判断链表中是否存在要删除的数据
{
printf("链表中未找到要删除的数据!\n");
// exit(0);
return;
}
p->next = r->next; //删除操作
free(r); //释放删除节点的内存
}
//将链表各个节点的数据打印出来
void printList(LinkedList L)
{
LinkedList p;
if(L->next==NULL) { //判断链表是否为空
printf("链表为空!\n");
return;
}
p = L->next;
while(p->next!=NULL)
{
printf("%d->",p->data);
p = p->next;
}
printf("%d\n",p->data);
}
int main()
{
LinkedList li;
int option;
printf("输入要进行的操作\n");
printf("-----------------\n");
printf("1 头插法创建链表\n");
printf("2 尾插法插法创建链表\n");
printf("3 插入节点\n");
printf("4 删除节点\n");
printf("0 退出\n");
while(scanf("%d",&option)&&option!=0) //输入指令
{
switch (option)
{
case 1:
li = createH(); //头插法创建链表
printList(li); //打印链表
break;
case 2:
createT(); //尾插法创建链表
printList(li); //打印链表
break;
case 3:
insertNode(li); //插入节点
printList(li); //打印链表
break;
case 4:
deleteNode(li); //删除节点
printList(li); //打印链表
break;
}
printf("输入要进行的操作: ");
}
return 0;
}
代码参考于https://www.cnblogs.com/newwy/archive/2010/10/10/1847456.html