实现链表的以下基本操作
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;
}