c语言算法链表
Ⅰ 在C语言中,什么是链表呀
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。
Ⅱ C语言链表的使用方法
D
答案D设置完,p就从链表中丢掉了。
p就是一个指向结构体node的指针。
p->next就是p包含的执行下一个node的指针,在本题,就是q。
Ⅲ 如何用C语言创建一个链表,实现增、删、改、查
#include
Ⅳ C语言做链表的排序
主要修改了sort函数,采用冒泡排序算法进行排序的。
你其他的两个函数写的不错,就sort函数写的有问题,已经很不错了。
注意:程序结束,最好对链表进行销毁,否则,内存永远也不会释放,导致内存泄漏了。
修改如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define N 5
typedef struct node
{
char name[20];
int score;
struct node *link;
}stud;
stud *sort(stud *head) /*排序函数*/
{
stud *temp=NULL; //默认为NULL,也就是链表的结尾
stud *ptr1=head;
stud *ptr2=head->link;
while(ptr1->link!=temp)//(ptr1!=NULL)
{
//ptr2=ptr1->link; //放在循环体下面了
while(ptr2->link!=temp)//(ptr2!=NULL)
{
if(ptr1->link->score > ptr2->link->score) //(ptr1->score > ptr2->score)
{//交换 ptr1->link和ptr2->link,而不是ptr1和ptr2,否则无法交换
ptr1->link=ptr2->link;
ptr2->link=ptr2->link->link;//temp->link=ptr2;
ptr1->link->link=ptr2;//ptr2->link=ptr1;
}
ptr1=ptr1->link;//ptr2=ptr2->link;
ptr2=ptr1->link;//从上面移动下来的
}
temp=ptr2;//新加的
ptr1=head;//ptr1=ptr1->link;
ptr2=ptr1->link;//从上面移动下来的
}
return (head);
}
stud * creat(int n)
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
s->link=NULL;//p->link=s; //跟下句对调了一下,为了把相关的代码放在一起
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name);
printf("请输入第%d个人的分数",i+1);
scanf("%d",&s->score);
p->link=s; //s->link=NULL;//跟上句对调了一下,为了把相关的代码放在一起
p=s;
}
return(h);
}
void print(stud *h)
{
stud *p;
p=h->link;
printf("数据信息为:\n");
while(p!=NULL)
{
printf("%s ",&*(p->name));
printf("的分数为%d\n",p->score);
p=p->link;
}
}
void main()
{
stud *head;
head=creat(N);
head=sort(head);
print(head);
getchar();
}
Ⅳ 如何用C语言编写一个链表
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct Node
{
int data;//数据域
struct Node * next;//指针域
};
/*************************************************************************************
*函数名称:Create
*函数功能:创建链表.
*输入:各节点的data
*返回值:指针head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函数名称:insert
*函数功能:在链表中插入元素.
*输入:head 链表头指针,p新元素插入位置,x 新元素中的数据域内容
*返回值:无
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函数名称:del
*函数功能:删除链表中的元素
*输入:head 链表头指针,p 被删除元素位置
*返回值:被删除元素中的数据域.如果删除失败返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函数名称:print
*函数功能:打印链表中的元素
*输入:head 链表头指针
*返回值:无
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函数名称:main
*函数功能:主函数创建链表并打印链表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}
Ⅵ C语言单链表算法问题
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
void ListDeleteMax(LinkList L,int *e);
int ListInsert(LinkList L,int i,int e);
void DestroyList(LinkList L);
void ListTraverse(LinkList L);
int main(void)
{
LinkList L;
int i,j,m;
int a[]={6,5,4,3,2,1};
InitList(&L);
for(i=0; i<6; ++i)
m = ListInsert(L,i+1,a[i]);
printf("链表的内容为:");
ListTraverse(L);
ListDeleteMax(L,&j);
printf("删除最大元素%d后,链表的内容为:",j);
ListTraverse(L);
DestroyList(L);
return 0;
}
void InitList(LinkList *L)
{
*L = (LinkList )malloc(sizeof(LNode));
if(!*L)
exit(-1);
(*L)->next = NULL;
}
int ListInsert(LinkList L,int i,int e)
{
int j=0;
LinkList p = L;
LinkList s;
while(p&&j<i-1)
{
p = p->next;
j++;
}
if(!p || j>i-1)
{
return 0;
}
s = (LinkList)malloc(sizeof(LNode));
s ->data = e;
s->next = p->next;
p->next = s;
return 1;
}
void ListDeleteMax(LinkList L,int *e) //删除最大元素
{
LinkList p = L->next;
LinkList s = L; //s指向最大结点前面的结点
LinkList q;
int m = p->data; //m保存最大的值
while(p->next)
{
q=p->next;
if(q->data > m)
{
m = q->data;
s = p;
}
p=p->next;
}
q = s->next;
s->next = q->next;
*e = q->data;
free(q);
}
void DestroyList(LinkList L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
}
void ListTraverse(LinkList L)
{
LinkList p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
Ⅶ C语言里的链表
首先你要明白链表是什么,链表中有1个数据区域和1个指针区域,指针区域存放的是下一个节点的地址(如果有下个节点的话),这是单链表,如果是双链表的话,那么有2个指针区域,1个指向前1个节点的地址,1个指向后1个节点的地址,如果对链表不是很熟悉,得先去看看数据结构,链表并不是数据结构里面的东西。
接下来我们看看在C语言中如何表示链表。
typedef struct Linklist
{
int data;
struct Linklist * next;
}Linklist;
定义一个结构体来表示链表,int data 代表数据,根据实际情况自己修改,struct Linklist * next 代表指针,指向下1个节点的,比如现在有3个节点A B C ,如果他们的next为NULL ,这3个节点就是毫无关系的,分散的,如果定义A->next =&B B->next=&C 那么他们就变成链表了,即A->B->C
如果是双链表,那么在结构体中定义的时候加上struct Linklist * prev 这个指针指向前1个节点的地址,比如A->next=&B B->prev=&A 那么现在双链表就为A B相互指向,这里不好画出来就没画了。
至于链表的添加,删除之类的可以再看看C语言里面的,如果还不会在来问我吧~