赞
踩
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
data域:存放结点值的数据域
next域:存放结点的直接后继的地址(位置)的指针域(链域)
链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的,每个结点只有一个链域的链表称为单链表
头结点:单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。
终端结点:结点无后继,故终端结点的指针域为空,即NULL。
- typedef struct node{
- int data;
- struct node *next;
- }list;
- void creatlist(list *head)
- {
- int n,i;
- list *p,*q;
- printf("输入数字个数:");
- scanf("%d",&n);
- printf("输入数字:");
- p=head;
- head->next=NULL;
- for(i=0;i<n;i++)
- {
- q=(list*)malloc(sizeof(list));
- scanf("%d",&q->data);
- p->next=q;
- q->next=NULL;
- p=q;
- }
- getchar();
- }
注意:创建时候要考虑题目中有没有说要带头结点,如果要带头结点,head结点中就不能存放数据;如果不带头结点,head结点就要放数据。(上述代码是不带头结点的链表)
- void Print(list *head)
- {
- list *p;
- p=head->next;
- while(p!=NULL)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
- void Delete(list *head){
-
- list *p,*q,*t;
- p=head->next;
- int k;
- while(p->next!=NULL){
- t=p;
- q=t->next;
- k=0;
- if(p->data==q->data)
- {
- q=q->next; //如果相同,则q往后移
- t->next=q; //让t的下一个变成往后移的q,就断开了了之前q的结点
- if(p->next==NULL)
- break;
- k=1;
- }
- if(p->next==NULL)
- break;
- else
- {
- if(k==0)
- p=p->next;
- }
- }
- }
- void jugde(list *head){
- list *p,*q;
- p=head->next;
- while(p!=NULL){
- q=p->next;
- while(q!=NULL){
- if(p->data<q->data){
- printf("格式错误!");
- getchar();
- exit(0);}
- else
- q=q->next;
- }
- p=p->next;
- }
- }
- void Inversion(list *head){
- list *p,*q;
- p=head->next;
- head->next=NULL;
- while(p!=NULL){
- q=p;
- p=p->next;
- q->next=head->next;
- head->next=q;
- }
- }
以下是第一步的逆置过程
读者可以接着这个循环一直遍历下去,就能知道整个逆置过程了
- #include<stdio.h>
- #include<malloc.h>
- #include<stdlib.h>
- typedef struct node{
- int data;
- struct node *next;
- }list;
- void creatlist(list *head)
- {
- int n,i;
- list *p,*q;
- printf("输入数字个数:");
- scanf("%d",&n);
- printf("输入数字:");
- p=head;
- head->next=NULL;
- for(i=0;i<n;i++)
- {
- q=(list*)malloc(sizeof(list));
- scanf("%d",&q->data);
- p->next=q;
- q->next=NULL;
- p=q;
- }
- getchar();
- }
- void Print(list *head)
- {
- list *p;
- p=head->next;
- while(p!=NULL)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
-
- void Delete(list *head){
-
- list *p,*q,*t;
- p=head->next;
- int k;
- while(p->next!=NULL){
- t=p;
- q=t->next;
- k=0;
- if(p->data==q->data)
- {
- q=q->next;
- t->next=q;
- if(p->next==NULL)
- break;
- k=1;
- }
- if(p->next==NULL)
- break;
- else
- {
- if(k==0)
- p=p->next;
- }
- }
- }
-
- void jugde(list *head){
- list *p,*q;
- p=head->next;
- while(p!=NULL){
- q=p->next;
- while(q!=NULL){
- if(p->data<q->data){
- printf("格式错误!");
- getchar();
- exit(0);}
- else
- q=q->next;
- }
- p=p->next;
- }
- }
-
- void Inversion(list *head){
- list *p,*q;
- p=head->next;
- head->next=NULL;
- while(p!=NULL){
- q=p;
- p=p->next;
- q->next=head->next;
- head->next=q;
- }
- }
-
- int main(){
- list head;
- creatlist(&head);
- jugde(&head);
- Delete(&head);
- Inversion(&head);
- printf("结果:");
- Print(&head);
- getchar();
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。