猿问
下载APP

请问c 语言的单链表 index是从零开始,还是一开始?

c 语言的单链表 index是从零开始,还是一开始


ITMISS
浏览 176回答 5
5回答

万千封印

通常链表只记录表头指针phead通过函数对 链表的复杂算法 进行封装,比喻清空链表,插入节点等。所以第一个链表节点 是否为0,要查询进行封装的函数。不知道我的回答是否解决了你的问题

桃花长相依

参考一下吧!#include<stdlib.h>#include<stdio.h>typedef struct LNode{int&nbsp;num;struct LNode *next;}LNode,*linklist;void Insertlist(linklist &L,int e) /*L为已知有序递增链表,在L的适当位置插入p,使得L保持有序性*/{linklist p1,q,p2;p1=(linklist)malloc(sizeof(LNode));p1->num=e;if(L->next) /*判断链表L是否为空链表*/{q=L->next;/*将L第一个元素地址给q*/p2=L;while(q->next&&q->num<p1->num)/*若q不是最后一个节点,且q的值小于p的值则q后移一位*/{&nbsp;p2=q;q=q->next;}if(q->num>=p1->num) /*查找插入位置*/{ p1->next=q;p2->next=p1;}else{ q->next=p1;p1->next=NULL;} /*插入节点*/}else{ L->next=p1;p1->next=NULL;}}void createlist(linklist &L)/*创建带头结点的有序链表*/{ int i,m,k;L=(linklist)malloc(sizeof(LNode));L->next=NULL;printf("请输入链表的长度:");scanf("%d",&m);printf("请输入数据: "); /*建立一个带头节点单链表*/for(i=0;i<m;i++){ scanf("%d",&k); /*输入数据*/Insertlist(L,k); /*调用插入函数,将新生成的节点插入链表中*/}printf("\n");}void turnback(linklist &L) /*链表的逆置*/{linklist p,q;p=L->next; /*p指向第一个元素*/L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;p=q;}}void mergelist(linklist &L1,linklist L2) /*合并L1,L2两个链表,用的地址L1作为新链表地址返回*/{ linklist p1,p2,p3,p4;p1=L1->next;p2=L2->next;p3=L1;while(p1&&p2){ if(p1->num<=p2->num) /*若p1的值小于或等于p2的值,则帕p1\p3同时后移*/{ p3=p1;p1=p1->next;}else /*若p1的值大于p2的值,则p1前插入p2,p2和p3后移*/{ p4=p2->next;p2->next=p1;p3->next=p2;p3=p2;p2=p4;}}p3->next=p1?p1:p2; /*插入剩余段*/free(L2); /*释放L2的头节点*/}void printlist(linklist L) /*打印已知链表*/{ linklist p;p=L->next;while(p){ printf("%5d",p->num); /*输出数据*/p=p->next;}printf("\n");}void main(){linklist L1,L2;printf("创建有序链表L1\n");createlist(L1);printf("单链表L1为:");printlist(L1);printf("创建有序链表L2:\n");createlist(L2);printf("L2链表为:");printlist(L2);mergelist(L1,L2); //调用合并两个链表的函数printf("合并两个单链表后新的链表为:\nnum score\n");printlist(L1);printf("递减排序:");turnback(L1);printlist(L1);}

慕斯709654

#include"stdafx.h"#include<stdlib.h>//创建一个节点,data为value,指向NULLNode*Create(intvalue){Node*head=(Node*)malloc(sizeof(Node));head->data=value;head->next=NULL;returnhead;}//销毁链表boolDestroy_List(Node*head){Node*temp;while(head){temp=head->next;free(head);head=temp;}head=NULL;returntrue;}//表后添加一个节点,Create(value)boolAppend(Node*head,intvalue){Node*n=Create(value);Node*temp=head;while(temp->next){temp=temp->next;}temp->next=n;return0;}//打印链表voidPrint_List(Node*head){Node*temp=head->next;while(temp){printf("%d->",temp->data);temp=temp->next;}printf("\n");}//在链表的第locate个节点后(头节点为0)插入创建的节点Create(value)boolInsert_List(Node*head,intlocate,intvalue){Node*temp=head;Node*p;Node*n=Create(value);if(locate<0)returnfalse;while(locate--){if(temp->next==NULL){temp->next=Create(value);returntrue;}temp=temp->next;}p=temp->next;temp->next=n;n->next=p;returntrue;}//删除第locate个节点后(头节点为0)的节点boolDelete_List(Node*head,intlocate){Node*temp=head;Node*p;if(locate<0)returnfalse;while(locate--){if(temp==NULL){returnfalse;}temp=temp->next;}p=temp->next->next;free(temp->next);temp->next=NULL;temp->next=p;returntrue;}//获取链表长度(不包括头节点)intSize_List(Node*head){Node*temp=head;intsize=0;while(temp->next){temp=temp->next;size++;}returnsize;}//链表的三种排序(选择,插入,冒泡)boolSort_List(Node*head){intt=0;intsize=Size_List(head);//选择排序/*for(Node*temp=head->next;temp!=NULL;temp=temp->next){for(Node*p=temp;p!=NULL;p=p->next){if(temp->data>p->data){printf("换%d和%d\n",temp->data,p->data);t=temp->data;temp->data=p->data;p->data=t;}}}*///插入排序/*for(Node*temp=head->next->next;temp!=NULL;temp=temp->next){for(Node*p=head;p->next!=NULL;p=p->next){if(p->next->data>temp->data){printf("换%d和%d\n",temp->data,p->next->data);t=temp->data;temp->data=p->next->data;p->next->data=t;}}}*///冒泡排序for(Node*temp=head->next;temp->next!=NULL;temp=temp->next){for(Node*p=head->next;p->next!=NULL;p=p->next){if(p->data>p->next->data){t=p->data;p->data=p->next->data;p->next->data=t;}}}return0;}扩展资料:return表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。

喵喔喔

#include<stdio.h>#include<malloc.h>typedef struct node{int data;/*data代表成绩分数*/struct node *next;}LNode,*LinkList;LinkList Creat(void)/*创建链表,结束标志为当输入的数据为0!*/{LinkList H,p1,p2;int n;n=0;p1=p2=(LinkList)malloc(sizeof(LNode));printf("输入数据:");scanf("%d",&p1->data);H=NULL;while(p1->data!=0){n=n+1;if(n==1)H=p1;elsep2->next=p1;p2=p1;p1=(LinkList)malloc(sizeof(LNode));scanf("%d",&p1->data);}p2->next=NULL;return(H);}LinkList Sort(LinkList SL)/*递增排序函数:入口参数:链表的头指针,此为链表中的排序函数*/{LinkList p,q;int temp;for(p=SL;p!=NULL;p=p->next){for(q=p->next;q!=NULL;q=q->next){if(p->data>q->data){temp=q->data;q->data=p->data;p->data=temp;}}}return SL;}int main(){LinkList L,S,K;L=Creat();printf("初始化的单链表数据序列为:\n");for(S=L;S!=NULL;S=S->next)printf("%d ",S->data);Sort(L);printf("\n按递增顺序排序后的序列为:\n");for(K=L;K!=NULL;K=K->next)printf("%d==>",K->data);return 0;}希望对你有帮助,如果有问题可以继续找我!

FFIVE

1、参照数组的冒泡排序和选择排序法,2、关键在于怎样交换两个链表单元的内容(但next指针不能换)3、有两种方法:一,把相应的信息一个一个交换,(但next指针不能换),这样比较麻烦,易于理解。二,先把next指针交换,再把两个两个链表单元(结构体类型变量可以)的全部内容交换,这样相当于next指针位置没变,又达目的了。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答