#include<stdio.h>
#include<stdlib.h>
//函数执行后返回的状态值
#define OK 1
#define ERROR 0
//函数执行后返回的状态值
typedef int Status;
//元素的数据类型,这里假设为int
typedef int ElemType;
//组成链表的单个结点的结构体
typedef struct node
{
//存放数据
ElemType data;
//指向下一个结点
struct node *next;
}Node;
//函数声明
Node * findNodeAtX(Node *head,int x);
void loopLinkList(Node *head);
/**
* 在链表第x个位置上插入元素e
* */
Status LiskInsert(Node **Phead, int x, ElemType e)
{
if(x == 1)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = e;
p->next = *Phead;
*Phead = p;
return OK;
}
Node *s = findNodeAtX(*Phead,x-1);
if(s == NULL)
{
printf("参数i错误");
return ERROR;
}
else
{
Node *p = (Node*)malloc(sizeof(Node));
p->data = e;
//A->B->C
p->next = s->next;
s->next = p;
return OK;
}
}
/**
* 删除链表第x个元素,有错误
* */
Status removeAtX(Node **Phead, int x, ElemType *e)
{
Node *p,*s;
//如果删除的是第一个结点
if(x == 1)
{
s = *Phead;
if(*Phead == NULL)
return ERROR;
else
{
*Phead = (*Phead)->next;
free(s);
//loopLinkList(*Phead);
return OK;
}
}
p = findNodeAtX(*Phead,x-1);
if(p==NULL)
{
printf("第%d个结点不存在\n",x-1);
return ERROR;
}
else if(p->next == NULL)
{
printf("第%d个结点不存在\n",x);
return ERROR;
}
else
{
//A->B->C
s = p->next;
*e = s->data;
p->next = s->next;
free(s);
return OK;
}
}
/**
* 创建链表
* */
Node * CreateList()
{
Node *head=NULL, *p,*q;
int length;
printf("输入结点个数");
scanf("%d",&length);
for(int i = 0; i < length; i++)
{
q = (Node *)malloc(sizeof(Node));
q->next = NULL;
if(head == NULL)
head = q;
else
p->next = q;
printf("输入该结点存放的数据");
scanf("%d",&q->data);
p = q;
}
return head;
}
/**
* 遍历链表
* */
void loopLinkList(Node *head)
{
Node *p = head;
printf("链表中的数据\n");
while(p!=NULL)
{
printf("%d\n",p->data);
p = p->next;
}
}
/**
* 找到链表第X个节点
* */
Node * findNodeAtX(Node *head,int x)
{
int j = 1;
Node *findNode = head;
while(findNode!=NULL && j<x)
{
findNode = findNode->next;
j++;
}
//如果改成if(p==NULL)return NULL;esle return p;
//不可以如果x为负数则返回的是head
if(j == x)
return findNode;
else
return NULL;
}
/**
* 按值查找
* */
Node * findElem(Node *head,ElemType find)
{
//空指针的意思就是什么也不指,而指向空的指针不是空指针
Node *p = head;
while(p!=NULL && p->data!=find)
{
p = p->next;
}
return p;
}
int main(int argc, char const *argv[])
{
Node *myList;
ElemType *e;
myList = CreateList();
LiskInsert(&myList,1,9);
loopLinkList(myList);
removeAtX(&myList,1,e);
loopLinkList(myList);
return 0;
}
运行结果