您的位置:首页 > 编程语言 > C语言/C++

单链表的C语言实现

2016-07-06 22:59 363 查看
//单链表的C语言实现

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef int DATATYPE;

//链表结点的数据结构定义
typedef struct node{
DATATYPE data;
struct node *next;

}LinkList;

//创建单链表,带头结点
LinkList *LinkList_Create(){
LinkList *head=(LinkList*)malloc(sizeof(LinkList));
if(head==NULL){
printf("创建失败!");
return NULL;
}
else
printf("创建成功!\n");
head->next=NULL;
head->data=0;
return head;
}

//单链表测长度 ,包含头结点
int LinkList_Length(LinkList *list){
int length=0;
LinkList *p;
p=list;
while(p!=NULL){
p=p->next;
length++;
}
printf("The length of list is : %d\n",length);
return length;
}

//头插法 ,插入num个数据
LinkList *Insert_head(LinkList *list,int num){
LinkList *p,*pnew;
int data;
p=list;
if(p==NULL){
printf("list为空,不合法!");
return NULL;
}
while(num--){
printf("please input the data: ");
scanf("%d",&data);
pnew=(LinkList*)malloc(sizeof(LinkList));
pnew->data=data;
pnew->next=p->next;
p->next=pnew;
}
return list;
}

//尾插法 ,插入num个数据
LinkList *Insert_Tail(LinkList *list,int num){
LinkList *p,*pnew;
int data;
p=list;
if(p==NULL){
printf("list为空,不合法!");
return NULL;
}
else
{
while(p->next!=NULL)
p=p->next;
while(num--){
pnew=(LinkList*)malloc(sizeof(LinkList));
printf("please input the data: ");
scanf("%d",&data);
pnew->data=data;
pnew->next=NULL;
p->next=pnew;
p=pnew;
}
}
return list;
}

//往链表中指定位置插入指定数据 ,规定表头为位置0
LinkList *insert(LinkList *list,int location,int data){
LinkList *p,*t;
p=list;
int i;
t=(LinkList*)malloc(sizeof(LinkList));
while(p!=NULL){
for(i=0;i<location-1;i++){
p=p->next;
}
t->next=p->next;
t->data=data;
p->next=t;
return list;
}
}

//删除链表中指定位置的结点
LinkList *LinkList_Delete(LinkList *list,int location){
LinkList *p,*t;
int i;
p=list;
if(p!=NULL){
for(i=0;i<location-1;i++){
p=p->next;
}
t=p->next;
p->next=t->next;
free(t);
t=NULL;
}
return list;
}

//打印链表
void Link_Printf(LinkList *list){
LinkList *p;
p=list;
printf("The data of the list is : ");
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

//删除链表中结点数据为data的第一个结点
LinkList *delete(LinkList *list,DATATYPE data){
LinkList *p,*t;
p=list;
while(p->next!=NULL){
if(p->next->data==data){
t=p->next;
p->next=t->next;
free(t);
}
else
p=p->next;
}
return list;
}

//将链表翻转 ,利用头插法
LinkList *reverse(LinkList *list){
LinkList *p1,*p2,*p3;
p1=list;
p2=list->next;//原链表的当前处理结点
list->next=NULL;//设置单链表初始为空
while(p2!=NULL){
p3=p2->next;
p2->next=list->next;
list->next=p2;
p2=p3;
}
return list;
}

int main(int argc, char *argv[]) {
int length;

LinkList *list = LinkList_Create();
length=LinkList_Length(list);
list=Insert_head(list,5);
list=Insert_Tail(list,5);
list=insert(list,6,0);
list=LinkList_Delete(list,6);
Link_Printf(list);
list=reverse(list);
Link_Printf(list);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表