数据结构(c语言)-单链表操作验证

1.实验内容

(1)用头插法(或尾插法)建立带头结点的单链表,
(2)对已建立的单链表实现插人、删除、查找等基本操作。

2.实现提示

首先,将单链表中的结点定义为如下结构类型:
typedef int ElemType;
/*定义线性表的单链表存储结构*/
 typedef struct LNode {   
    ElemType data;   struct LNode *next; 
    } LNode; 
    typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */

3.实验源码

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 5
#define ERROR 0
#define OK 1
typedef struct node{     //定义节点 	
        int data;	
        struct node *next;
        }linklist;
        linklist *Initlist()  //初始化单链表
         {	
         linklist *head;	
         head=(linklist*)malloc(sizeof(linklist));	
         head->next=NULL;	
         return head;
         }
         linklist *CreateList(int n)  //用尾插法创建单链表 
         {	
         int i;	
         linklist *head,*p,*r;	
         head=(linklist*)malloc(sizeof(linklist));	
         head->next=NULL;	
         r=head;	
         for(i=1;i<=n;i++)	{		
         p=(linklist*)malloc(sizeof(linklist));		
         p->next=NULL;		
         scanf("%d",&p->data);		
         r->next=p;		
         r=r->next;	 
         } 	
          return head;
          }
          linklist *CreateList2(int n)  //用尾插法创建单链表 {	
           int i;	
           linklist *head,*p,*r;	
           head=(linklist*)malloc(sizeof(linklist));	
           head->next=NULL;	
           r=head;	
           for(i=n-1;i>=0;--i){		
           p=(linklist*)malloc(sizeof(linklist));		
           p->next=NULL;		
           scanf("%d",&p->data);		
           p->next=r->next;		
           r->next=p;	 
           } 	
            return head;
            }
            void printlist(linklist *head)   //输出链表 {
            linklist *p;	
            int i=1;	
            p=head->next;	
            while(p!=NULL)	{		
            printf("%d\t",p->data);		
            p=p->next;		
            i++;	}	
            printf("\n");
            }
            void listlength(linklist *head)  //求表长 {	
            int count=0;	
            linklist *p;
            p=head->next;	
            while(p!=NULL)	{		
            count++;		
            p=p->next;	
            }
            printf("链表的长度为%d\n",count);
            }
            int insertlist(linklist *head,int i,int x)    //在第i个位置上插入新的元素 {	
            int j;	
            linklist *p,*s;	
            p=head;	
            j=0;	
            while(p!=NULL&&j<i-1){		
            p=p->next;		
            j++;	 
            } 	
             if(p==NULL||i<1) 
             return ERROR; 		
              s=(linklist*)malloc(sizeof(linklist));	 
              s->data=x;	
               s->next=p->next;	 
               p->next=s;	 
               return OK;
               }
               int deletelist(linklist *head,int i)  //删除i位置上面的元素
                {	
                int j;	
                linklist *p,*q;	
                p=head;j=0;	
                while(p!=NULL&&j<i-1)
                {		
                p=p->next;		
                j++;	
                }	if(p==NULL||i<1)  
                return ERROR;	
                q=p->next;	
                p->next=q->next;	
                free(q);	
                return OK;
                }int locatelink(linklist *head,int x)   //求元素x在链表的哪个位置 {	
                linklist *p;	
                int j;	
                p=head->next;	
                j=1;	
                while(p!=NULL&&p->data!=x)	{		
                p=p->next;		
                j++;	}	
                printf("所输入元素的位置为:%d",j);	
                if(p==NULL) return ERROR;	
                else return j;
                }int clearlist(linklist *head)   //清空链表 {	
                linklist *p,*q;	
                p=head->next; 	
                head->next=NULL;
                while(p!=NULL)	{		
                q=p;		
                p=p->next;		
                free(q);	
                	}	
                return 1;
                }
                	int main(){	
                	int i,a,x,n,m; 	
                	linklist *head,*head1;    
       		printf("请输入要构建的链表的长度(尾插法):\n");	
       		scanf("%d",&n); 	
       		head=CreateList(n); //输入的元素为 1 3 5 7 9 	
       		printf("输入的元素构成的链表输出为:\n");	
       		printlist(head);	
       		listlength(head);	
       		printf("请输入要定位的元素:\n");	
       		scanf("%d",&x);	locatelink(head,x);	
       		printf("\n请输入要插入元素的位序(插入的数固定为10)\n");	
       		scanf("%d",&m);	
       		insertlist(head,m,10);	
       		printf("重新输出插入元素10的链表:\n");	
       		printlist(head); 	
       		printf("请输入要删除元素的位序:\n");	
       		scanf("%d",&i); 	
       		deletelist(head,i);	
       		printf("重新输出删除元素的链表:\n");	
       		printlist(head);	
       		printf("\n请输入要构建的链表的长度(头插法):\n");	
       		scanf("%d",&a);	
       		head1=CreateList2(a);	
       		printf("输入的元素构成的链表输出为:\n");	
       		printlist(head1);	
       		listlength(head1);	
       		return 0;
       		}
发布了13 篇原创文章 · 获赞 1 · 访问量 411

猜你喜欢

转载自blog.csdn.net/qq_43775034/article/details/102596347
今日推荐