#include<stdlib.h>
#include<stdio.h>
typedef struct LNode {
int data;
struct LNode* next;
}LNode,*LinkList;
LinkList CreateLinkList(LinkList L); //创建单链表,并返回头指针
int GetElemLinkList(LinkList L, int *e); //查找单链表第i位在值,并返回给e
int InsertLinkList(LinkList L, int i, int e); //在第i个位置插入e值
int DeleteLinkList(LinkList L, int i, int* e); //删除第i个位置的元素,把删除的值返给e
int UpdateLinkList(LinkList L); //改变数据 ,先增加再删除。
void print(LinkList L); //遍历单链表
void main()
{
LinkList LHead=NULL; //头结点为空
int a = 0;
LHead=CreateLinkList(LHead);
//a = GetElemLinkList(LHead,&a);
//a = DeleteLinkList(LHead,2 , &a);
//InsertLinkList(LHead, 2,2);
//UpdateLinkList(LHead);
print(LHead);
return;
}
LinkList CreateLinkList(LinkList L) //创建有头结点的单链表,长度为n ,从末尾开始插入数据
{
LinkList p;
int i;
int length;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入单链表的长度");
scanf("%d", &length);
for(i=length;i>0;--i)
{
printf("请输入第%d位元素 ",i);
p = (LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d", &p->data);
p->next = L->next; L->next = p; //插入到表头
}
return L->next;
}
void print(LinkList L) //遍历数据显示元素,从第一个元素开始,正历。
{
LinkList p = L;
while (p!=NULL)
{
printf("%2d", p->data);
p = p->next;
}
return;
}
int GetElemLinkList(LinkList L, int* e)
{
LinkList p = L;
int i;
int j = 1;
printf("请输入第i个位置 ");
scanf("%d", &i);
while (p && j < i)
{
p = p->next; ++j;
}
if (!p || j > i)
{
return -1;
}
*e = p->data;
printf("第%d个元素是%2d",i,*e);
return *e;
}
int InsertLinkList(LinkList L, int i, int e)
{
LinkList p = L; int j = 1;
while (p && j < i - 1)
{
p = p->next; ++j; //寻找第i-1个结点
}
if (!p || j > i - 1) return -1;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next; p->next = s;
return 1;
}
int DeleteLinkList(LinkList L, int i, int* e)
{
LinkList p = L;int j = 1;
//LinkList q = L;
while (p->next && j < i-1 ) //寻找第i个结点,并令p指向其前趋
{
p = p->next; ++j;
}
if (!(p->next) || j > i-1)
{
printf("删除位置不合理");
return -1;
}
/*q = p->next; p->next = q->next;
*e = q->data;*/
*e = p->next->data;
p->next = p->next->next;
printf("被删除的是第%d个元素%d ", i, *e);
return *e;
}
int UpdateLinkList(LinkList L)
{
int i,val;
printf("请输入修改的第i个位置");
scanf("%d", &i);
//==DeleteLinkList(L,2,2)
printf("请输入修改的值为");
scanf("%d", &val);
InsertLinkList(L, i, val);
DeleteLinkList(L, i+1, &i);
return 1;
}