#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define LEN sizeof(struct LNode)
struct LNode{
int data;
struct LNode *next;
};
typedef struct LNode LNode,* LinkList;
//初始化
LinkList InitLNode(void){
LinkList head = (LinkList)malloc(LEN);
if(!head){
printf("存储空间分配失败!\n");
exit(ERROR);
}
head->data = 0;
head->next = NULL;
return head;
}
//逆序创建单链表
int transCreat(LinkList head){
LinkList pnew;
pnew = (LinkList)malloc(LEN);
printf("请依次输入数据(输入-1认为输入终止)\n");
scanf("%d",&pnew->data);
while(pnew->data!=-1){//先把后边的串上再串前边的
head->data++;
pnew->next = head->next;//核心语句
head->next = pnew; //核心语句
pnew = (LinkList)malloc(LEN);
scanf("%d",&pnew->data);
}
free(pnew);//此时的pnew数据域里存放着-1 没有被链入到链表中 无用
return OK;
}
//输出单链表
int printLNode(LinkList head){
if(!head->next){
printf("空链表!\n");
return ERROR;
}
LinkList p;
p = head->next;
do{
printf("%d ",p->data);
p = p->next ;
}while(p);
}
//插入
int insertLNode(LinkList head,int num,int locate){
if(locate<1||locate>head->data+1){
printf("插入位置有误!\n");
exit(ERROR);
}
LinkList pnew,p;
int i=0;
p = head;//p指向第0个结点 i也表示第0个结点
pnew = (LinkList)malloc(LEN);
pnew->data = num;
while(p&&i<locate-1){//p的位置停在所要插入位置的前一位
p = p->next;
i++;//p往后移动 i作为一个位置游标就加1
}
pnew->next = p->next;
p->next = pnew;
head->data++;
return OK;
}
//删除
int delLinkList(LinkList head,int locate){
if(!head->next){
printf("空链表!\n");
exit(ERROR);
}
if(locate<1||locate>head->data){
printf("位置有误!\n");
return ERROR;
}
LinkList pleft,pright;
int i = 0;
pleft = pright = head;
while(pright&&i<locate){
pleft = pright;
pright = pright->next;
i++;//pright和i指的是同一个结点
}
pleft->next = pright->next;
head->data--;
free(pright);
return OK;
}
main(){
LinkList head;
head = InitLNode();
transCreat(head);
printLNode(head);
printf("\n\n在单链表第5个元素前插入一个值为999的元素后结果是:\n");
insertLNode(head,999,5);
printLNode(head);
printf("\n\n删除单链表第5个元素后结果是:\n");
delLinkList(head,5);
printLNode(head);
}