#include //定义结点类型
typedef struct Node {
int data; //数据类型,你可以把int型的data换成任意数据类型,包括结构体struct等复合类型
struct Node* next; //单链表的指针域
} Node, * LinkedList;
LinkedList LinkedListCreatH(int n);
LinkedList LinkedListInsert(LinkedList L, int i, int x);
void LinkedListGet(LinkedList L, int i);
void printList(LinkedList L);
LinkedList LinkedListDelete(LinkedList L, int x);
int main() {
//创建
LinkedList list;
int n, m, idex, num;
scanf("%d", &n);
list = LinkedListCreatH(n);
scanf("%d", &m);
while (m--) {
char s[10];
scanf("%s", s);
if ('g' == s[0]) {
scanf("%d", &idex);
LinkedListGet(list, idex);
}
else if('i'==s[0]) {
scanf("%d%d", &idex, &num);
list = LinkedListInsert(list, idex, num);
}
else if ('d' == s[0]) {
scanf("%d", &idex);
list = LinkedListDelete(list, idex);
}
else {
printList(list);
}
}
return 0;
}
//单链表的建立1,头插法建立单链表
LinkedList LinkedListCreatH(int n)
{
Node* L;
L = (Node*)malloc(sizeof(Node)); //申请头结点空间
L->next = NULL; //初始化一个空链表
int x; //x为链表数据域中的数据
for (int i = 0; i < n;i++) {
scanf("%d", &x);
Node* p;
p = (Node*)malloc(sizeof(Node)); //申请新的结点
p->data = x; //结点数据域赋值
p->next = L->next; //将结点插入到表头L-->|2|-->|1|-->NULL
L->next = p;
}
return L;
}
//单链表的插入,在链表的第i个位置插入x的元素
LinkedList LinkedListInsert(LinkedList L, int i, int x)
{
Node* pre, *list; //pre为前驱结点
pre = L;
list = L;
int tempi = 0;
for (tempi = 1; tempi < i; tempi++) {
pre = pre->next; //查找第i个位置的前驱结点
if (pre == NULL && i!=1 ) {
printf("insert fail\n");
return list;
}
}
Node* p; //插入的结点为p
p = (Node*)malloc(sizeof(Node));
p->data = x;
p->next = pre->next;
pre->next = p;
printf("insert OK\n");
return L;
}
void LinkedListGet(LinkedList L, int i)
{
LinkedList temp;
int ret = 1;
temp = L;
while (i--) {
temp = temp->next;
if (temp == NULL) {
ret = 0;
}
}
if (ret) {
printf("%d\n", temp->data);
}
else {
printf("get fail\n");
}
}
//单链表的删除
LinkedList LinkedListDelete(LinkedList L, int x)
{
Node* pre,*list, *temp; //pre为前驱结点
pre = L;
list = L;
int tempi = 0;
if (L->next == NULL) {
printf("delete fail\n");
return list;
}
for (tempi = 1; tempi < x; tempi++) {
pre = pre->next; //查找第i个位置的前驱结点
if (pre == NULL) {
printf("deletet fail\n");
return list;
}
}
temp = pre->next;
pre->next = temp->next; //删除操作,将其前驱next指向其后继。
free(temp);
printf("delete OK\n");
return L;
}
//遍历输出单链表
void printList(LinkedList L)
{
Node* p = L->next;
int i = 0;
if (p == NULL) {
printf("Link list is empty\n");
return;
}
while (p) {
printf("%d", p->data);
if (p->next) printf(" ");
else printf("\n");
p = p->next;
}
}
```