1. 单向链表
/*创建单向链表*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct LNode{
int data;
struct LNode * next;
};
//该函数创建一个单向链表
struct LNode * create(int n){
int i;
struct LNode * head,*p1,*p2; //head头指针,p1为新建指针,p2指向链表末尾
int a;
head=NULL;
printf("输入整数:\n");
for(i=n;i>0;--i){
p1=(struct LNode *)malloc(sizeof(struct LNode));
scanf("%d",&a);
p1->data=a;
if(head==NULL){
head=p1;
p2=p1;
}else{
p2->next=p1;
p2=p1;
}
}
p2->next=NULL;
return head;
};
int main()
{
int n;
struct LNode * q;
printf("输入你想创建的节点个数:\n");
scanf("%d",&n);
q=create(n);
printf("结果是:\n");
while(q){ //输出链表
printf("%d ",q->data);
q=q->next;
}
return 0;
}
2. 创建双向链表
/*创建双向链表*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
typedef struct node{
char name[20];
struct node * prior,*next;
}stud; //双向链表的结构定义
//创建一个双向链表
stud * creat(int n){
stud * p,*h,*s; //p指向尾节点,h指向头节点,s为新建节点
int i;
h=(stud *)malloc(sizeof(stud));
h->name[0]='\0';
h->prior=NULL;
h->next=NULL;
p=h;
for(i=0;i<n;++i){
s=(stud *)malloc(sizeof(stud));
p->next=s;
printf("输入第%d个学生的姓名:",i+1);
scanf("%s",s->name);
s->prior=p;
s->next=NULL;
p=s;
}
p->next=NULL;
return h;
}
//该函数实现查找要删除的节点
stud * search(stud *h,char *x){
stud *p;
char *y;
p=h->next;
while(p){
y=p->name;
if(strcmp(y,x)==0) //判断字符串y是否和要查找的字符串x一致
return p;
else
p=p->next;
}
printf("没有找到数据!\n");
}
//删除链表中指定的节点
void del(stud *p){
p->next->prior=p->prior;
p->prior->next=p->next;
free(p);
}
int main()
{
int number;
char sname[20];
stud * head,*sp;
puts("请输入链表的大小:");
scanf("%d",&number);
head=creat(number);
sp=head->next;
printf("\n现在这个双链表是:\n");
while(sp){
printf("%s ",&*(sp->name));
sp=sp->next;
}
printf("\n\n请输入你想查找的姓名:\n");
scanf("%s",sname);
sp=search(head,sname);
printf("你想查找的姓名是:%s\n",*&sp->name);
del(sp);
sp=head->next;
printf("\n现在这个双链表是:\n");
while(sp){
printf("%s ",&*(sp->name));
sp=sp->next;
}
return 0;
}
3. 创建循环链表
/*创建循环链表*/
#include <stdio.h>
#include <stdlib.h>
//声明struct student类型
typedef struct student{
int num;
struct student * next;
}LNode,*LinkList;
//自定义函数create(),实现创建一个循环链表
LinkList create(void){
LinkList head; //head指向头
LNode *p1,*p2; //p1指向新建节点,p2指向尾节点
char a;
head=NULL;
a=getchar();
while(a!='\n'){
p1=(LNode *)malloc(sizeof(LNode));
p1->num=a;
if(head==NULL){
head=p1;
}else{
p2->next=p1;
}
p2=p1;
a=getchar();
}
p2->next=head; //尾节点指向头节点
return head;
}
int main()
{
LinkList L1,head;
printf("请输入循环链表 \n");
L1=create();
head=L1;
printf("这个合成的链表是:\n");
printf("%c",L1->num);
L1=L1->next;
while(L1!=head){ //循环到头节点结束
printf("%c",L1->num);
L1=L1->next;
}
return 0;
}