① 用c语言写一个简单的链表,具体要怎么用代码实现
可以用结构体和指针来实现
定义:
定义一个单个元素的结构
typedef struct Chain_tag { // 这里用typedef来定义,方便使用 int data; // 这里的数据可以是任意类型 //其他数据 struct Chain_tag *prev, *next;// 由于Chain为不完全类型,故只能用指针的方式声明} Chain;
使用:
用单个结构体的指针作为head
#include <malloc.h> //Chain的定义写在这里 Chain *alloc_single_chain(int data /*, (其他参数)*/){ Chain *tmp; tmp = malloc(sizeof(Chain)); tmp.data = data; //...其余数据初始化 tmp.prev = tmp.next = NULL; // 将前后指针置为NULL return tmp;} voiddispose_chain(Chain *target) //其实这里功能简单,用宏实现也可以{ free(target); return;} int main(){ Chain *head; Chain *pos; head = alloc_single_chain(10);//初始化起始结点 head->next = alloc_single_chain(11);//同理。。下一个结点 for (pos = head; pos; pos = pos->next)//清理垃圾好习惯 { dispose_chain(pos); } return 0;}
② C语言创建链表,函数调用部分
#include<stdio.h>
#include<windows.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//定义数据类型名称
typedef int DataType;
#define flag -1 //定义数据输入结束的标志数据
//单链表结点存储结构定义
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;
//建立单链表子函数
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x; //定义指向当前插入元素的指针
while(1)
{
scanf("%d",&x);
if(-1==x)
{ return head;
break;}
s= (LNode *)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s->data =x;
s->next =NULL;
i++;
if(i==1)
head=s;
else
L->next =s;
L=s;
}
}
//查找子函数(按序号查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j; //j是计数器,用来判断当前的结点是否是第i个结点
p=L;
j=1;
while(p!=NULL&&j<i)
{
p=p->next ; //当前结点p不是第i个且p非空,则p移向下一个结点
j++;
}
return p;
}
//插入运算子函数
void Insert_LinkList(LinkList L,int i,DataType x) //在单链表L中第i个位置插入值为x的新结点
{
LNode *p,*s;
p =Get_LinkList(L,i); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s->data =x;
s->next =p->next ;
p->next =s;
}
}
//单链表的删除运算子函数
void Delete_LinkList(LinkList L,int i) //删除单链表上的第i个结点
{
LNode *p,*q;
p=Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("删除的位置不合法!"); //第i个结点的前驱结点不存在,不能执行删除操作
exit(-1);
}
else
{
if(p->next ==NULL)
{
printf("删除的位置不合法!"); //第i个结点不存在,不能执行删除操作
exit(-1);
}
else
{
q=p->next ;
p->next =p->next->next;
free(q);
}
}
}
//求表长运算子函数
int Length_LinkList(LinkList L)
{
int l; //l记录L的表长
LNode *p;
p=L;
l=1;
while(p->next)
{
p=p->next;
l++;
}
return l;
}
int main ()
{
LNode *head,*p;
head=(LinkList)malloc(sizeof(LNode));
int x,y;
a:
printf("*******menu*******
");
printf("**创建**********1*
");
printf("**插入**********2*
");
printf("**删除**********3*
");
printf("**表长**********4*
");
printf("**清屏**********5*
");
printf("**打印**********6*
");
printf("**退出******other*
");
printf("******************
");
int i=1;
while(i)
{
printf("请输入选项:");
scanf("%d",&i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf("请输入位置和数据;");
scanf("%d%d",&x,&y);
Insert_LinkList(head,x,y);break;
case 3:printf("请输入位置;");
scanf("%d",&x);
Delete_LinkList(head,x);break;
case 4:printf("%d",Length_LinkList(head));break;
case 5:system("cls");goto a;
case 6:p=head;
while(p!=NULL)
{printf("%d
",p->data);
p=p->next;}
break;
default :i=0;
}
}
}
我把创建给改了一下
③ 求写C语言 创建链表实例子。要最基本的 包括注释。
题目:创建固定长度的单向链表
程序分析:链表是动态分配存储空间的链式存储结构,
其包括一个“头指针”变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址。
链表中每一个元素称为“结点”,每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域。指针域中存储的即是链表的下一个结点存储位置,是一个指针。多个结点链接成一个链表。
最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没有后继结点。
使用结构体变量作为链表中的结点,因为结构体变量成员可以是数值类型,字符类型,数组类型,也可以是指针类型,这样就可以使用指针类型成员来存放下一个结点的地址,使其它类型成员存放数据信息。
在创建列表时要动态为链表分配空间,C语言的库函数提供了几种函数实现动态开辟存储单元。
malloc()函数实现动态开辟存储单元:
malloc函数原型为:void *malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间,函数返回值是一个指向分配域起始地址的指针(类型为void)。如果分配空间失败(如,内存空间不足),则返回空间指针(NULL)
#include<stdio.h>
#include<malloc.h>
structLNode
{
intdata;
structLNode*next;
};
/*上面只是定义了一个结构体类型,并未实际分配内存空间
只有定义了变量才分配内存空间*/
structLNode*creat(intn)
{
inti;
structLNode*head,*p1,*p2;
/*head用来标记链表,p1总是用来指向新分配的内存空间,
p2总是指向尾结点,并通过p2来链入新分配的结点*/
inta;
head=NULL;
for(i=1;i<=n;i++)
{
p1=(structLNode*)malloc(sizeof(structLNode));
/*动态分配内存空间,并数据转换为(structLNode)类型*/
printf("请输入链表中的第%d个数:",i);
scanf("%d",&a);
p1->data=a;
if(head==NULL)/*指定链表的头指针*/
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
p2->next=NULL;/*尾结点的后继指针为NULL(空)*/
}
returnhead;/*返回链表的头指针*/
}
voidmain()
{
intn;
structLNode*q;
printf("请输入链表的长度:/n");
scanf("%d",&n);
q=creat(n);/*链表的头指针(head)来标记整个链表*/
printf("/n链表中的数据:/n");
while(q)/*直到结点q为NULL结束循环*/
{
printf("%d",q->data);/*输出结点中的值*/
q=q->next;/*指向下一个结点*/
}
}