线性表,单链表的C语言实现,基本操作:初始化,插入,获取,删除,输出链表,插入时并保持有序。
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkedList;
//初始化链表
int InitList(LinkedList *L){
*L=(LinkedList)malloc(sizeof(LNode));
if(L == NULL){
printf("申请内存空间失败\n");
exit(0);
}
(*L)->next = NULL;
return OK;
}
//插入
int Insert(LinkedList *L, int num){
LNode *p,*q,*s;
q=*L;
p=q->next;
while(p!=NULL && num>p->data){
q=p;
p=p->next;
}
s=(LNode *)malloc(sizeof(LNode));
s->data=num;
s->next=p;
q->next=s;
return OK;
}
//获取元素
int GetElem(LinkedList L,int i,int *e)
{
int j=1;
LNode *p;
p = L->next;
while (p && j < i)
{
p = p->next;
++j;
}
if ( !p || j>i )
return ERROR;
*e = p->data;
return OK;
}
//删除元素
int deleteList(LinkedList *L,int i,int *e){
LNode *q,*p;
int j=1;
q=*L;
p=(*L)->next;
while(p!=NULL&&j<i){
q=p;
p=p->next;
j++;
}
if(!p||j>i) return ERROR;
*e = p->data;
q->next=p->next;
free(p);
return OK;
}
//输出链表
int ListOutput(LinkedList *L){
LNode *p;
p=(*L)->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return OK;
}
//求链表长度
int ListLength(LinkedList *L){
LNode *p;
int i=0;
p=(*L)->next;
while(p!=NULL){
i++;
p=p->next;
}
return i;
}
int main(){
LinkedList L;
InitList(&L);
int x;
printf("请输入链表数据:\n");
while(scanf("%d",&x)!=EOF){
Insert(&L,x);
}
printf("输出链表:\n");
ListOutput(&L);
printf("\n");
printf("请输入要插入的数据:");
scanf("%d",&x);
Insert(&L,x) ;
printf("输出链表:\n");
ListOutput(&L);
printf("\n");
printf("请输入要提取的数据位置:\n");
int i;
int e;
scanf("%d",&i);
if(GetElem(L,i,&e))
printf("所要数据为:%d\n",e);
else printf("输入错误!\n");
printf("请输入要删除的数据位置:\n");
scanf("%d",&i);
deleteList(&L,i,&e);
ListOutput(&L);
printf("链表长度:%d\n",ListLength(&L));
return 0;
}