c语言简单单向链表的制作

这个链表很简单,是单向链表,实现了一些基本的增删查找功能。

单向链表代码
/***************************************************************************
* Copyright (C) 2012 by root *
* 作者:xcl 时间:2012.2.7 *
* 文档说明:链表的基本操作 *
**************************************************************************
*/


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node{ //数据结构
char data[10];
struct node *next;

}NODE;

int IsExist(NODE *head,char newData[]){ //检查是否存在字符串
int flag=0;
NODE *p;
p=head->next;
if(head!=NULL){
do{
if(strcmp(newData,p->data)==0){ //字符串比较函数
flag=1;
break;
}
else{
p=p->next;
}
}while(p!=NULL);
return flag;
}
}


void Create(NODE *head){ //新建链表,可判断 是否存在相同字段
NODE *p;
int m,i=1;
char end;
char temp[10];
printf("\t*******************\n");
printf("\t**CREATE LINKLIST**\n");
printf("\t*******************\n");
printf("Please insert your data:\n");
do{
printf("DATA:");
p=(NODE*)malloc(sizeof(NODE));
if(p==NULL) exit(0);
//scanf("%s",p->data);//不知道为什么不循环
if(i==1){
gets(p->data);
p->next=head->next;
head->next=p;
i++;
}
else{
gets(temp);
m=IsExist(head,temp);
if(m==1){
printf("Insert Faild!Cannot Allowed Same Data!\n\n");
}
else{
strcpy(p->data,temp);//字符串赋值函数
p->next=head->next;
head->next=p;
}
}
fflush(stdin);
printf("Continue Insert ?(y/n)");
end=getchar();
getchar();
}while(end=='y');
}


Output(NODE *head){ //打印链表
NODE *p;
p=head->next;
if(head!=NULL){
printf("The Linklist is:\n");
do{
printf("->%s",p->data);
p=p->next;
}while(p!=NULL);

printf("\n");
}
else
printf("The Linklist IsNot Exist!\n");
}


int Insert(NODE *head){ //插入数据,判断 数据是否存在
int flag=0,n=1,i,m; //flag监视否插入成功,n用于查找节点,m用于返回是否存在相同数据
NODE *q,*new; //q指针用于定位要插入的节点
new=(NODE*)malloc(sizeof(NODE));
new->next=NULL;
printf("\t*******************\n");
printf("\t**INSERT LINKLIST**\n");
printf("\t*******************\n");
printf("New Data's Position:");
scanf("%d",&i);
printf("The data:");
scanf("%s",new->data);
//判断是否存在相同数据
m=IsExist(head,new->data);
if(m==1){
printf("Insert Faild!Cannot Allowed Same Data!\n\n");
}
else{
for(q=head;n<i&&q->next!=NULL;++n)//定位
q=q->next;
new->next=q->next; //赋值新节点位置
q->next=new;
flag=1;
}
return flag;
}


int Delete(NODE *head){//删除链表节点
int i,n;
NODE *p,*q;
p=head;
printf("\t*******************\n");
printf("\t**DELETE LINKLIST**\n");
printf("\t*******************\n");
printf("Chose The No. U want DEL:");
scanf("%d",&i);
for(n=0;n<i-1&&p->next!=NULL;++n)
p=p->next; // 定位节点
if(i>0&&p->next!=NULL){ //删除节点
q=p->next;
p->next=p->next->next;
free(q);
}

}

int main(int argc, char *argv[]){//主函数
NODE *head;
head=(NODE*)malloc(sizeof(NODE));
head->next=NULL;
Create(head);
Output(head);
Insert(head);
Output(head);
Delete(head);
Output(head);
return EXIT_SUCCESS;
}



转载于:https://www.cnblogs.com/matizz/archive/2012/03/06/nice.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值