查看就得从头开始数,然后知道位置,插入的话只要找到位置后将指针位置换一下,所以说链式结构适合插入删除操作
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ERROR 0
#define OK 1
typedef struct Node
{
int data;
struct Node* next;
};
typedef struct Node* LinkList;
//头插法创建单链表
void CreateListHead(LinkList* L)
{
LinkList p;
int i;
int a[] = {1,2,3,4,5};
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for (i = 0; i < 5; i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = a[i];
p->next = (*L)->next;
(*L)->next = p;
}
}
//尾插法创建单链表
void CreateListTail(LinkList* L)
{
LinkList p, r;
int b[] = { 1,2,3,4,5 };
int i;
*L = (LinkList)malloc(sizeof(Node));
r = *L; //就是让r指向尾部结点
for (i = 0; i < 5; i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = b[i];
r->next = p; //连接到r后面
r = p; //将r移到尾部
}
r->next = NULL; //最后
}
//单链表中某个位置上插入元素
void InsertList(LinkList* L, int n, int e)
{
LinkList p, s;
p = *L;
int j = 1;
while (p && j < n)
{
p = p->next;
j++;
}
if (!p && j > n)
{
exit(0);
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next; //先让生成的结点指向p的下一个
p->next = s; //然后p指向s就连接上了
}
//删除单链表中某个位置的元素
void DeleteListnumber(LinkList* L, int n)
{
LinkList p, q;
p = *L;
int j = 1;
while (p->next && j < n)
{
p = p->next;
j++;
}
if (!(p->next) && j > n)
{
exit(0);
}
q = p->next; //q就是要删除的结点
p->next = q->next; //就是让p的下一个指向p的下一个的下一个,就空掉q
free(q);
}
//输出链表元素
void ShowList(LinkList L)
{
LinkList p = L->next;
while (p)
{
printf("链表的元素%d\n", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList p;
printf("这里是头插法的单链表,输入的会倒过来输出\n");
CreateListHead(&p);
ShowList(p);
InsertList(&p, 2, 222);
ShowList(p);
LinkList m;
printf("这里是尾插法的单链表,输入的会顺序输出\n");
CreateListTail(&m);
ShowList(m);
DeleteListnumber(&m, 2);
ShowList(m);
}
结果输出