C语言如何创建单链表?

Python016

C语言如何创建单链表?,第1张

C语言创建单链表如下:

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

#include "iostream.h"

typedef struct node

{

int  data

node * next

}node , * List

void create(int n)

{

int c

List s,L

L=(List)malloc(sizeof(node))

L->next=NULL

printf("请输入第1个数据:")

scanf("%d",&c)

L->data=c

for(int i=2i<=ni++)

{

s=(List)malloc(sizeof(node))

printf("请输入第%d个数据:",i)

scanf("%d",&c)

s->data=c

s->next=L

L->next =s

}

printf("链表创建成功!")

}

void main()

{

int n

printf("请你输入链表的个数:")

scanf("%d",&n)

create(n)

}

单链表创建方法:

单链表的建立有头插法、尾插法两种方法。

1. 头插法

单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点

由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。

链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。

2. 尾插法

若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。

首先,你真的确定你知道什么是链表,什么是顺序表?好了,算了就按题中的顺序表来写喽(不过,我真的建议你,如果你真不清楚,请把它弄清楚,ok?)程序代码:(看上去有点多,其实算法很简单的)#include<stdlib.h>

#include<stdio.h>

#include<conio.h>#define LIST_INT_SIZE 1000

#define ERROR 0

#define OK 1typedef struct {

int *elem

int length

int listsize

}ListSqtypedef int StatusStatus Initlist_sq(ListSq *l){

//初始化顺序表

l->elem=(int *)malloc(LIST_INT_SIZE*sizeof(int))

if(!l->elem) exit(ERROR)

l->length =0

l->listsize=LIST_INT_SIZE

return OK

}Status InputList_sq(ListSq *l,int length){

//对顺序表进行输入,输入的长度为:length

//length的区间为[1,1000]

int i

if(length >1000 ||length<1) exit(ERROR)

printf("please input the data:\n")

for(i=0i<lengthi++){

scanf("%d",l->elem+i)

l->length++

}

return OK

}Status OutputList_sq(ListSq *l){

//把顺序表输出

int *p

for(p=l->elemp<=&(l->elem[l->length-1])p++)

printf("%d ",*p)

return OK

}Status ListDelete_sq(ListSq *l,int i){

//删除顺序表中位序为i的元素

//注意i的取值范围!

int *p,*pe

if(i<1 || i>1000) exit(ERROR)

p=&(l->elem[i+1])

pe=&(l->elem[l->length-1])

while(p<=pe){

*(p-1)=*p

p++

}

l->length--

return OK

}Status ConvertList_sq(ListSq *l){

//这个操作就是执行你题目要求的那玩意

int i,j,k

for(i=0i<l->lengthi++){

k=i

for(j=0j<ij++)

if(l->elem[i]==l->elem[j])

ListDelete_sq(l,i)

}

return OK

}

int main(void)

{

ListSq list

int length,status

printf("Creat a new SQlist:\n")

status=Initlist_sq(&list)

if(!status)

{

printf("\aWarning:Failed to Creat the List\n")

getch()

exit(ERROR)

}

else {

printf("succeed to creat!\n")

printf("******** status of the list *********\n")

printf("the length is %d\nthe listsize is %d\n",list.length,list.listsize)

}

printf("Now you could input the data for the list:\n")

printf("How many datas do you want to input:")scanf("%d",&length)

InputList_sq(&list,length)

OutputList_sq(&list)

printf("\nthe result of converting list:")

ConvertList_sq(&list)

OutputList_sq(&list)

putchar('\n')

return 0

}一下是运行结果: 好了,完成任务了。。。算法不难,认真思考就搞定,望楼主坚持下去,不断努力!

对了,要是程序上有什么不懂得,hi我就可以了

do

{

printf("%d ",p->data)

p=p->next

}while((p->next)!=NULL)

上面改为:

do

{

printf("%d ",p->data)

p=p->next

}while(p!=NULL)