不会建立动态链表和线性表,求帮助
解决方案
12
所谓动态链表,是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #include <stdio.h> #include <stdlib.h> struct Student { int No;//学号 struct Student *next; }; int main() { struct Student *p1, *p2, *head; int n = 0; //结点个数 head = NULL; p1 = (struct Student *)malloc(sizeof(struct Student)); printf("请输入1个学号\n"); scanf("%d", &p1->No); p2 = p1; //开始时,p1和p2均指向第1个结点 while (p1->No != 0) { n++; if (n == 1) { head = p1; } else { p2->next = p1; } p2 = p1;//p2是最后一个结点 printf("请输入学号,输入0终止:\n"); p1 = (struct Student *)malloc(sizeof(struct Student)); scanf("%d", &p1->No); }; p2->next = NULL;//输入完毕后,p2->next为NULL //遍历动态链表 struct Student *p; p = head; while (p != NULL) { printf("%d,", p->No); p = p -> next; } printf("\n"); system("pause"); }
7
仅供参考:
//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE { int data; struct NODE *next; } H,*head,*p,*q,*q1,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() { srand(time(NULL)); //填写头节点数据 H.data=-1; H.next=NULL; head=&H; //创建10个节点的单链表 p=head; for (i=0;i<10;i++) { q=(struct NODE *)malloc(sizeof(struct NODE)); if (NULL==q) return 1; q->data=rand()%100;//填写0..99的随机值 q->next=NULL; p->next=q; p=q; } //输出整个单链表 s=head->next; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d->",s->data); s=s->next; } //将值为5的结点插入到单链表的第k个结点前 k=3; n=0; p=head; while (1) { if (NULL==p) { break; } n++; if (k==n) { q=(struct NODE *)malloc(sizeof(struct NODE)); if (NULL==q) return 1; q->data=5; q->next=p->next; p->next=q; break; } p=p->next; } //输出整个单链表 s=head->next; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d->",s->data); s=s->next; } //删除第k个节点 k=5; n=0; p=head; while (1) { if (NULL==p) { break; } n++; if (k==n) { q=p->next; if (q) { p->next=q->next; free(q); } break; } p=p->next; } //输出整个单链表 s=head->next; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d->",s->data); s=s->next; } //从小到大排序 for (p=head;p!=NULL && p->next!=NULL;p=p->next) { for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) { if (p->next->data > q->next->data) { //交换data // printf("swap %02d %02d\n",p->next->data,q->next->data); // t=p->next->data;p->next->data=q->next->data;q->next->data=t; //或 //交换next // printf("swap %02d %02d\n",p->next->data,q->next->data); s1=p->next; s2=p->next->next; s3=q->next; s4=q->next->next; if (s2!=s3) { p->next=s3; s3->next=s2; q->next=s1; s1->next=s4; } else { p->next=s3; s3->next=s1; q=s3; s1->next=s4; } //输出整个单链表 // s=head->next; // while (1) { // if (NULL==s) { // printf("\n"); // break; // } // printf("%02d->",s->data); // s=s->next; // } // getchar(); } } } //输出整个单链表 s=head->next; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d->",s->data); s=s->next; } //将整个链表逆序 if (head->next!=NULL && head->next->next!=NULL) { p=head->next; q=p->next; p->next=NULL; while (1) { q1=q->next; q->next=p; p=q; q=q1; if (NULL==q) break; } head->next=p; } //输出整个单链表 s=head->next; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d->",s->data); s=s->next; } //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10 m=4; n=6; k=0; p=head; while (1) { if (NULL==p) { break; } k++; if (m+1==k) { q=p; } s=p; p=p->next; } s1=head->next; head->next=q->next; s->next=s1; q->next=NULL; //输出整个单链表 s=head->next; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d->",s->data); s=s->next; } //释放全部节点 p=head->next; while (1) { if (NULL==p) { break; } q=p->next; free(p); p=q; } return 0; } //84->28->20->23->96->19->59->97->29->41-> //84->28->05->20->23->96->19->59->97->29->41-> //84->28->05->20->96->19->59->97->29->41-> //05->19->20->28->29->41->59->84->96->97-> //97->96->84->59->41->29->28->20->19->05-> //41->29->28->20->19->05->97->96->84->59-> //
7
其实数组,字符串,链表,栈,队列,等等都可以看成 线性表
所谓线性表 指的是 表内全部元素顺次排列,没有分枝的一种数据结构
简称线表
与线表 想对的树,图,广义表 等数据结构,不是线表
另外哈希表,虽然经常用数组实现,但不是链表
原因是它的元素,是稀疏地
线表的元素是挨个排列的
假如 ,实现线表的题目,是老师布置的作业,或书上的作业
那么一般指的是,数据用数组或指针表示,
并附加一个长度信息,表示表中元素数目,另一个
可以动态增长的数组 这么定义 int a[0];
这样 整个数据结构为
stuct table{
int len;
int a[0];
};
int n;
table *p =()malloc(n*sizeof(a[0]) +sizeof(table);
…..
至于链表,逐个分配节点内存,并存入数据,并把这些节点连接起来。就形成了链表
……………………………………
所谓线性表 指的是 表内全部元素顺次排列,没有分枝的一种数据结构
简称线表
与线表 想对的树,图,广义表 等数据结构,不是线表
另外哈希表,虽然经常用数组实现,但不是链表
原因是它的元素,是稀疏地
线表的元素是挨个排列的
假如 ,实现线表的题目,是老师布置的作业,或书上的作业
那么一般指的是,数据用数组或指针表示,
并附加一个长度信息,表示表中元素数目,另一个
可以动态增长的数组 这么定义 int a[0];
这样 整个数据结构为
stuct table{
int len;
int a[0];
};
int n;
table *p =()malloc(n*sizeof(a[0]) +sizeof(table);
…..
至于链表,逐个分配节点内存,并存入数据,并把这些节点连接起来。就形成了链表
……………………………………