数据结构上机2——链表

实现链表的以下基本操作

1.创建一个链表(头插法、尾插法)
2.向链表中插入元素
3.删除链表中的某个元素
4.查找链表中的元素(按值找、按序号找)
5.输出链表中的元素


 注意链表里指针的指向
#include<stdio.h>   
#include<stdlib.h>  
typedef int ListData;
                                //此链表带表头节点!!! 
typedef struct node {          //链表结点 
   ListData  data;	                  //结点数据域
    struct node  * link;           //结点链域
} ListNode;

typedef ListNode  * LinkList;   //链表头指针
LinkList  first,last,L,T;                      

LinkList createListF ( void ) {
    int ch;
	ListNode *q; 
    LinkList  head =              //建立表头结点
        (LinkList) malloc (sizeof (ListNode));
    head->link = NULL;
    while(scanf("%d",&ch)) {	
    	   q = (ListNode *) malloc (sizeof(ListNode));
           q->data = ch;               //建立新结点
           q->link = head->link;  //插入到表前端
           head->link = q;
		   if(getchar()=='\n')	break;
    }
    return head;
}   

LinkList createListR ( void ) {
    int ch;   
    LinkList  head =                      //建立表头结点
        (LinkList) malloc (sizeof (ListNode));
    ListNode *q, *r = head; 
    
	while (scanf("%d",&ch)) {
           q = (ListNode *) malloc (sizeof(ListNode));
           q->data = ch;                 //建立新结点
           r ->link = q;   r =q;         //插入到表末端
           if(getchar()=='\n')	break;
    }
    r ->link = NULL;          
    return head;
}    

int ListInsert (int x, int i ) {
	//在链表第 i 个结点处插入新元素 x
    ListNode * p = T;
    for ( int k = 1; k < i; k++ )  //找第 i-1个结点 
       if ( p == NULL ) break; 
       else p = p->link; 
    if ( p == NULL && L != NULL ) {	
        printf( "无效的插入位置!\n");
        return 0;
    }
    ListNode *newnode =            //创建新结点
         (ListNode*) malloc(sizeof (ListNode)); 
	newnode->data=x;
	                              
         newnode->link = p->link;
         if ( p->link == NULL ) last = newnode; 
         p ->link = newnode;
      
      return 1;						
}

int ListRemove ( int i ) {
                                 //在链表中删除第 i 个结点
    ListNode *p, *q; 
    
       p = T;	 int k = 1;    //找第 i-1个结点
       while ( p != NULL && k < i)
          { p = p->link; k++; }
       if ( p == NULL || p->link == NULL ) {
          printf("无效的删除位置!\n"); return 0;
       } 	    
       else {           //删除表中或表尾元素
        q = p->link;       //重新链接
        p->link = q->link;        
       }
    
    if ( q == last ) last = p;	     //可能修改last
    int x = q->data;
    free(q);               //删除q
    return x;	      //返回第 i 个结点的值	
}

ListNode * Find ( LinkList first, ListData value ) {
		//在链表中从头搜索其数据值为value的结点 (假设存在) 
     ListNode * p = first->link;
          //指针 p 指示第一个结点
     while ( p != NULL && p->data != value ) {
     	 p = p->link;
     	 if(p==NULL) {
     	 	printf("值不存在"); 
		  }
	 }      
     return p;     
}

ListNode * Locate ( LinkList first, int i ) {
//返回表中第 i 个元素
    if ( i < 1 ) return NULL;   
    ListNode * p = first->link;   
	int k = 1; 
	//printf("%d",p->data);
    while ( p != NULL && k <i ) 
       { p = p->link;  k++; }	   //找第 i 个结点 
    if  ( k == i ) return p; //返回第 i 个结点
    else return NULL; 
}

int main()  
{  
	int i,num,j,k;
	T=createListF();//前插法 
	//T=createListR();
	L=T->link;
	while(1){
		printf("%d  ",L->data);
		if(L->link==NULL) break;
		else	L=L->link;   
	}	
	puts("");
	printf("input value of i:");  
    scanf("%d",&i);  
	printf("input a number:");  
    scanf("%d",&num);
	L=T->link;
    printf("%d  ",ListInsert (i, num ));
    puts("");
    L=T->link;
	while(1){
		printf("%d  ",L->data);
		if(L->link==NULL) break;
		else	L=L->link;   
	}
	puts("");
	L=T->link;
    printf("input a number:");  
    scanf("%d",&num);
    j=ListRemove (num);
    L=T->link;
	while(1){
		printf("%d  ",L->data);
		if(L->link==NULL) break;
		else	L=L->link;   
	}
	puts("");
	printf("input a number:");  
    scanf("%d",&k);
	printf("%d",Find(T,k)->data);
	printf("input value of i:");  
    scanf("%d",&i);  
    printf("%d",Locate(T,i)->data);
    return 0;  
}

反转链表:

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

/**
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode* ReverseList(struct ListNode* pHead ) {
    // write code here
    struct ListNode* pre=NULL;
    struct ListNode* pcur=pHead;
    struct ListNode* pnext;
    while(pcur){
        pnext=pcur->next;
        pcur->next=pre;
        pre=pcur;
        pcur=pnext;
    }
    return pre;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值